Так что я не уверен, что я что-то упускаю, но в основном каждый пример DI, который я вижу с ядром asp.net, показывает передачу параметров из файла 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)
{
....
}
}
Startup.cs в основном приложении ядра asp.net
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, я хочу иметь возможность вызывать SendErrorEmail из BusinessLayer (или любого другого места).
DoWork.cs
public MakeItWork()
{
try
{...}
catch (exception ex)
{
IEmailService.SendErrorEmail("BAL - MakeItWork",ex)
}
}
Но это просто не с нулевым исключением. DI при запуске не создает EmailService вместо IEmailService, и я собираюсь предположить, что параметров там тоже нет.
Спасибо за любую помощь, которую вы можете оказать.
---- EDIT ----
В итоге я просто переключился на использование AutoFac для DI. Он способен выполнить то, что я искал. Принял ответ ниже, чтобы дать Фантому очки за попытку помочь.