依赖注入电子邮件管理器构造函数调用

Dependency injection Email Manager constructor call

这是

的后续问题

所以,作为一个设置,我有一个 CustomConfiguration.cs 文件,它应该从我的 web.config 文件

中的配置部分填充

这是文件的签名

public class CustomConfiguration : ICustomProcessorConfig, IEmailConfig, IReportConfig
    {
        #region Properties

        private CustomProcessorConfig ConfigSection { get; set; }

        #endregion

        #region Constructors (1)

        public CustomConfiguration()
        {
            ConfigSection = ConfigurationManager.GetSection("customConfiguration") as ConfigSection;
        }

        #endregion Constructors 

        #region ICustomConfiguration Members

        public string Text { get { return ConfigSection.Text; } }

        public string Subject { get { return ConfigSection.Subject; } }

        public string SmtpHost { get { return ConfigSection.EmailSettings.SmtpHost; } }

        public int SmtpPort { get { return ConfigSection.EmailSettings.SmtpPort; } }

这些是我用于生成电子邮件的 3 个文件:

 public interface IEmailManager
    {

        void SendEmail(string toAddress, string fromAddress, string subject, string body, bool htmlBody);

}

 public interface IEmailConfig
    {
        string SmtpHost { get;  }

        int SmtpPort { get;  }
   }

最后我有了继承 IEmailManager 接口的电子邮件管理器

public class EmailManager: IEmailManager
    {

        #region Constructors (1)

        public EmailManager(IEmailConfiguration configuration)
        {
            CurrentSmtpClient = new SmtpClient
                                    {
                                        Host = configuration.SmtpHost,
                                        Port = configuration.SmtpPort,
                                        Credentials =
                                            new NetworkCredential(configuration.UserName, configuration.Password)
                                    };
        }

        #endregion Constructors 

// send Mail is also implemented
}

回到上一个问题,我的设置如下:

Container = new UnityContainer();
  Container.RegisterType<ICustomConfiguration,CustomConfiguration>(new ContainerControlledLifetimeManager()); 

                Container.RegisterType<IEmailManager, EmailManager>(new ContainerControlledLifetimeManager());

                Container.RegisterType<IReportGenerator, ReportGenerator>(new ContainerControlledLifetimeManager());

Configuration = Container.Resolve<ICustomConfiguration>(); 
                Emailer = Container.Resolve<IEmailManager>(); 
                ReportGenerator = Container.Resolve<IReportGenerator>(); 

我收到一条 ResolutionFailedException 消息说尝试为 EmailManager 调用构造函数时无法解析参数配置。

我有一个不同的 DI 设置,我仍然需要来自 IEmailConfig 的配置信息。有没有办法解决这个问题?我需要配置信息才能继续发送电子邮件,您可以通过我的设置猜到。

我是否将不同的存储库绑定到我的容器?或者我应该如何更改我的 EmailManager 代码?

IEmailConfiguration 在统一容器中缺少映射。需要添加映射此接口

的具体class

您需要在容器中使用 CustomConfiguration class 注册 IEmailConfig 接口。

  Container.RegisterType<IEmailConfig , CustomConfiguration >(new ContainerControlledLifetimeManager());