【发布时间】:2019-06-11 04:56:48
【问题描述】:
所以我不确定我是否只是遗漏了一些东西,但基本上我在 asp.net core 中看到的每个 DI 示例都显示了从 appSettings.json 文件通过控制器中的构造函数传递参数,然后传递给任何东西否则。
我可以绕过控制器直接注入一个类库吗?
举一个我想要做的例子,假设我有 appSettings.json
"EmailSettings":{"smtpServer":"mail.example.com", "port":123, "sendErrorsTo":"errors@example.com"}
然后是 EmailServices 的类库
EmailSettings.cs
public class EmailSettings{
public string smtpServer {get;set;}
public int port {get;set;}
public string sendErrorsTo {get;set;}
}
IEmailService.cs
public interface IEmailService
{
void SendErrorEmail(string method, Exception ex);
}
和 EmailService.cs
public class EmailService :IEmailService
{
private readonly EmailSettings _emailSettings;
public EmailService(EmailSettings emailSettings)
{
_emailSettings = emailSettings;
}
public void SendErrorEmail(string method, Exception ex)
{
....
}
}
主 asp.net 核心应用程序中的 Startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
services.AddScoped<IEmailService, EmailService>(p => {
return new EmailService(p.GetService<EmailSettings>());
});
...
}
无需通过控制器加载 EmailServices 或 appsetting.json 参数,然后加载到 BusinessLayer 类库中,我希望能够从 BusinessLayer(或任何其他地方)调用 SendErrorEmail。
DoWork.cs
public MakeItWork()
{
try
{...}
catch (exception ex)
{
IEmailService.SendErrorEmail("BAL - MakeItWork",ex)
}
}
但它只是失败了一个空异常。启动中的 DI 并没有创建 EmailService 来代替 IEmailService,我猜参数也不在那里。
感谢您提供的任何帮助。
----编辑----
我最终只是切换到使用 AutoFac 进行 DI。它能够完成我一直在寻找的东西。接受下面的答案,为 Phantom 提供尝试提供帮助的分数。
【问题讨论】:
标签: dependency-injection asp.net-core-2.1 class-library