[英]injecting settings resolved from IOption into additional class in .NET Core
如何注入從 IOptions 值創建的設置以調用某些類方法?
我有MailAppSettings
類和MailSender: IMailSender
。 兩者都在不同的 .NET 項目中。
MailAppSettings
中的值使用 .NET Core 中的IOptions
模式加載。 值從appsettings.json
配置加載。 對於 DI,我們使用 AutoFac,所以它看起來像這樣:
serviceCollection.AddOptions();
serviceCollection.Configure<MailAppSettings>(config.GetSection("MailAppSettings"));
然后我們像這樣訪問mailSettings
:
public class CustomerSender:ICustomerSender
{
private readonly MailSettings _mailSettings;
private readonly IMailSender _mailSender;
public MyCustomerSender(IOptions<MailSettings> mailSettings, IMailSender mailSender)
{
_mailSettings = mailSettings.Value;
_mailSender = mailSender;
}
public SomeCustomMethod1() {
// use of mailsettings
var recipient = mailSettings.Recipient1;
var body = BuildSomeBody();
var subject = mailSettings.Subject1;
// mail sending
_mailSender.Send(recipient, body, subject);
}
mailSender
是位於不同命名空間中的類,從不同項目的不同位置調用。
public class MailSender: IMailSender
{
private readonly IMailSenderSettings _mailSenderSettings;
public MailSender(IMailSenderSettings confg) ///!!! here we need to inject those settings
{
_mailSenderSettings= confg;
}
...
在這里,您看到mailSender
需要注入IMailSenderSettings
。 MailAppSettings
實現此接口(但也包含其他屬性)。
我的問題是 - 如何將MailAppSettings
注入IMailSenderSettings
? 如果我只是注冊這樣的類型:
containerBuilder.RegisterType<MailAppSettings>()
.As<IMailSenderSettings>()
.SingleInstance();
它不起作用,注入的 IMailSenderSettings 的值將為空。
IMailSenderSettings
以及MailAppSettings
包含recipient
、 smtp host,
password
、 user
,但MailAppSettings
還包含IMailSenderSettings
不需要的其他屬性
您將需要創建依賴於MailSettings
IMailSenderSettings
派生類
public class MyMailSenderSettings: IMailSenderSettings {
private readonly MailSettings mailSettings;
public MyMailSenderSettings(IOptions<MailSettings> options) {
this.mailSettings = options.Value;
}
public string SomeProperty => mailSettings.SomeMatchingProperty;
//... other members mapped from settings
}
以便可以在組合根中映射所需的成員。
從那里開始,只需要注冊實現,以便 DI 容器可以處理其余部分。
//...
serviceCollection.AddOptions();
serviceCollection.Configure<MailAppSettings>(config.GetSection("MailAppSettings"));
serviceCollection.AddSingleton<IMailSenderSettings, MyMailSenderSettings>()
//...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.