![](/img/trans.png)
[英]How can I use a service outside of Startup.cs in my ASP.NET Core Application?
[英]How to use a service declared on Startup.cs outside controllers
我正在使用 ASP.net 內核開發 web 應用程序,我是這項技術的新手。
我正在使用服務發送電子郵件,這里是 class:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using System.Net.Mail;
namespace WebApplication.Services
{
public class MessageSender : IEmailSender, ISmsSender
{
public MessageSender(IOptions<MessageSenderOptions> optionsAccessor)
{
Options = optionsAccessor.Value;
}
public MessageSenderOptions Options { get; } //set only via Secret Manager
public Task SendEmailAsync(string email, string subject, string message)
{
// Plug in your email service here to send an email.
using (var smtp = new SmtpClient(Options.emailServer))
{
var mail = new MailMessage
{
Subject = subject,
IsBodyHtml = true,
From = new MailAddress(Options.fromEmail, Options.fromName),
Body = message
};
if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") != "Development")
{
mail.To.Add(email);
}
else
{
mail.To.Add("test@gmail.com");
}
smtp.Send(mail);
}
return Task.FromResult(0);
}
public Task SendSmsAsync(string number, string message)
{
// Plug in your SMS service here to send a text message.
return Task.FromResult(0);
}
}
public class MessageSenderOptions
{
public List<string> emails { get; set; }
public string emailServer { get; set; }
public string fromEmail { get; set; }
public string fromName { get; set; }
}
}
我在我的 controller 中這樣稱呼它:
namespace WebApplication.Controllers
{
[Route("api/[controller]")]
public class MyController : Controller
{
private readonly Context _Context;
private IHostingEnvironment _environment;
private ILogger<MyController> _logger;
private MessageSender _messageSender;
public MyController(IOptions<RegistrarConnection> optionsAccessor,
Context dbContextd,
IHostingEnvironment environment,
ILogger<GestionAteliersController> logger,
MessageSender messageSender,
)
{
Options = optionsAccessor.Value;
_Context = dbContextd;
_environment = environment;
_logger = logger;
_messageSender = messageSender;
}
[Route("[action]")]
public IActionResult save([FromBody] Obj obj)
{
try
{
//code
string subjet = "Subject";
string message = "Message";
_messageSender.SendEmailAsync("test@gmail.ca", subjet, message);
var v = new { result = "OK" };
return this.Ok(v);
}
catch (Exception ex)
{
_logger.LogError(ex.ToString());
return new BadRequestObjectResult("Error");
}
}
這只是方法的一部分,一切正常。
我現在遇到的問題是我想調用這個方法
_messageSender.SendEmailAsync("test@gmail.ca", subjet, message);
在 controller 之外,在另一個 class 中,我不知道像 controller 那樣容易使用它。
我不明白它是如何使用 class MessageSender的構造函數的。
在Startup.cs文件中, ConfigureServices方法中有這部分代碼:
services.Configure<MessageSenderOptions>(Configuration.GetSection("MessageSenderOptions"));
services.AddTransient<IEmailSender, MessageSender>();
services.AddTransient<ISmsSender, MessageSender>();
services.AddTransient<MessageSender, MessageSender>();
在我的文件appsettings.json中有這部分代碼:
"MessageSenderOptions": {
"emailServer": "smtp.gmail.ca",
"emails": [
"test@gmail.ca"
],
"fromEmail": "abb@gmail.ca",
"fromName": "Test"
}
所以我假設以某種方式調用 mycontroller 的構造函數時,就像這條線完成了所有工作:
_messageSender = messageSender;
通過調用MessageSender的構造函數並使用 appsettings.json 文件中的參數IOptions < MessageSenderOptions > 。
但我不知道如何在另一個 class 中使用它:
public class HelloJob : IJob
{
/*private readonly ILogger _logger;
*/
private MessageSender _messageSender;
_messageSender.SendEmailAsync("test@gmail.ca", subjet, message);
}
如何使用Startup.cs中使用的appsettings.json的參數來實例化MessageSender以調用方法SendEmailAsync
謝謝您的幫助
檢查這個 url https://docs.microsoft.com/fr-fr/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.0
您需要在構造函數中傳遞 class 的實例
public class HelloJob : IJob
{
private readonly MessageSender _messageSender;
public HelloJob(MessageSender messageSender)
{
_messageSender = messageSender;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.