[英]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.