【问题标题】:Constructor injection with other, non-dependency, constructor arguments带有其他非依赖构造函数参数的构造函数注入
【发布时间】:2009-11-06 05:08:11
【问题描述】:

我是 IOC 容器的新手,我正在开始使用 NInject。

如果您希望您的构造函数具有不是服务且不需要由 IOC 容器实例化的参数,您会怎么做?

例如:

public class Person
{
    private readonly string _name;
    private readonly IPersonRepository _repository;

    public Person(string name, IPersonRepository repository)
    {
        _name = name;
        _repository = repository;
    }

    ......
}

假设 name 是 Person 类的要求,因此,为了确保 Person 始终有名称,我们需要将其传递给构造函数。

我们如何使用 NInject 获得 Person 的实例?名称需要由应用程序的任何部分创建一个新的人来传递,而 IOC 容器需要在 IPersonRepository 中传递。

我知道可以使用属性来注入名称或存储库,但这不是一个干净的解决方案 - 我们正在失去一些编程语言的语义能力。

【问题讨论】:

    标签: constructor ninject code-injection


    【解决方案1】:

    我问这个问题已经一年多了,现在我知道的比当时更多。凯文的回答是正确的,也是最佳实践,但有时您需要使用遗留类并想做一些像我在我的问题中遇到的事情。以下是我使用 NInject 的方法:

    public class Person
    {
        [Inject]
        public IPersonRepository PersonRepository { get; set; }
    
        private string _name;
    
        public Person(string name)
        {
             _name = name;
             StaticKernelContainer.Inject(this);
        }
    }
    

    可以在 NInject Web 扩展项目中找到 StaticKernelContainer 的实现。

    【讨论】:

    【解决方案2】:

    如上所述,该类不适合与 IOC 容器一起使用。您在这里将关注点与持有某些状态(名称)并执行某些操作(无论存储库用于什么)的 Person 实体混合在一起。如果您重构代码,以便通过一个通过构造函数实现 IPersonRepository 的类来检索或创建 Person 实体,那么您将处于依赖注入更有意义的地方。

    【讨论】:

      【解决方案3】:

      我非常不同意上述 Kevin McMahon 的回应,原因是我看到的依赖注入代码完全符合您的要求……仅使用不同的 IoC 容器。也就是说,它是 Castle Windsor,它是另一个 Ioc 容器。它允许您在配置文件中创建一个部分来说明为 name 提供哪些值(对 name 执行此操作没有多大意义,但如果它是像“connectionString”这样的属性,它可能会产生很多感觉)。

      所以...并不是说您正在尝试做的事情通常不适合依赖注入...只是 Ninject 似乎对此并不满意(或者也许 Ninject 也可以适应它.. . 我不知道它所有较少使用的功能都足以说明)。

      【讨论】:

      • 其实我认为 NInject 可以做到这一点:例如:stackoverflow.com/questions/1374098/… 但是必须将参数名称作为字符串传递;在 Intellisense 中没有可见的构造函数参数;长方法名('WithConstructorArguments')...让我休息一下!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2013-04-29
      • 2015-07-22
      • 1970-01-01
      相关资源
      最近更新 更多