簡體   English   中英

將從 IOption 解析的設置注入 .NET Core 中的附加類

[英]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包含recipientsmtp host, passworduser ,但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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM