【问题标题】:Dependency injection with constructor not working构造函数的依赖注入不起作用
【发布时间】:2023-12-12 16:28:01
【问题描述】:

我有以下代码

SmtpSection smtpsection = 
       (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");

EmailSettings emailSettings = new EmailSettings
        {
            WriteAsFile = bool.Parse(ConfigurationManager.AppSettings[""] ?? "false"),
            ServerPort = smtpsection.Network.Port,
            Username = smtpsection.Network.UserName,
            Password = smtpsection.Network.Password,
            UseSsl = smtpsection.Network.EnableSsl
        };

kernel.Bind<IEmailRepository>().To<EmailRepository>().WithConstructorArgument("settings", emailSettings);

public class EmailSettings 
{
        public string MailToAddress = "test@Test.com";
        public string MailFromAddress = "test@test.com";
        public bool UseSsl = true;
        public string Username = "";
        public string Password = "";
        public string ServerName = "";
        public int ServerPort = 587;
        public bool WriteAsFile = false;
        public string FileLocation = @"C:\sports_store_emails";
}

public class EmailController : Controller
{
        private IEmailRepository emailRepository;
        private EmailSettings emailSettings;

        public EmailController(IEmailRepository emailRepository, EmailSettings settings)
        {
            this.emailRepository = emailRepository;
            this.emailSettings = settings;
        }
}

public class EmailRepository : RepositoryBase<EmailEnquiry>, IEmailRepository
{
    public EmailRepository(IDatabaseFactory databaseFactory)
        : base(databaseFactory)
    {
    }
}

public interface IEmailRepository : IRepository<EmailEnquiry>
{
}

public interface IRepository<T> where T : class
{
        void Add(T entity);
        void Update(T entity);
        void Delete(T entity);      
        void Delete(Expression<Func<T, bool>> where);
        T GetById(long Id);
        T GetById(string Id);
        T Get(Expression<Func<T, bool>> where);
        IEnumerable<T> GetAll();
        IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
        IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
}

由于某种原因,NInject 设置的参数没有被传入。有谁知道这是为什么。 settings 使用的是 EmailSettings 内部的所有值,而不是从 NInject 传入的值?

【问题讨论】:

  • EmailRepository的实现在哪里?
  • 您必须将IDatabaseFactory 传递给EmailRepository 构造函数,而不是EmailSettings
  • 我已经在 ninject kernel.Bind().To();
  • 受保护的 RepositoryBase(IDatabaseFactory databaseFactory) { DatabaseFactory = databaseFactory; dbset = DataContext.Set(); }

标签: ninject


【解决方案1】:

如果您已经为IDatabaseFactory 配置了绑定,则可以将EmailRepository 创建为

var emailRepository = kernel.Get<EmailRepository>();

更新

要初始化EmailController 的实例,您可以使用

var emailController =
          new EmailController(kernel.Get<EmailRepository>(), settings);

【讨论】:

  • 我正在尝试通过依赖注入传递构造函数我将如何为 EmailController(IEmailRepository emailRepository,EmailSettings 设置)执行此操作
  • 那么我要在 ninject 中添加什么以传递设置?
  • 您已经拥有的不需要额外的配置。 Ninjcet 已经知道如何解析接口IDatabaseFactory 并且可以创建EmailRepository 的实例。
  • 参数设置如何
  • 我不明白你的意思。