在Simple Injector中注册具有多个构造函数和字符串依赖关系的类型

时间:2014-01-02 21:25:27

标签: c# dependency-injection inversion-of-control simple-injector constructor-injection

我正在试图弄清楚如何使用Simple Injector,我已经在项目周围使用它,没有注册简单服务及其组件的问题。

但是,我希望在具有两个以上实现接口的构造函数的组件时使用依赖注入器。

public DAL: IDAL
{
    private Logger logger;
    string _dbInstance;
    public DAL()
    {
        logger = new Logger();
    }

    public DAL(string databaseInstance)
    {
         logger = new Logger();
         _dbInstance = databaseInstance;
    }
}

以下是我注册服务的方式:

container.Register<IDAL, DAL>();

运行代码,这是发生的错误:

  

要使容器能够创建DAL,它应该完全包含   一个公共构造函数,但它有2个。

删除构造函数后,下一个错误是它不允许我的构造函数接受参数。

  

DAL类型的构造函数包含参数'databaseInstance'   type String不能用于构造函数注入。

有什么方法可以在类有2个以上的公共构造函数的情况下进行依赖注入?或者有一个接受参数的公共构造函数?

我在这里阅读了文档:SimpleInjector (Getting Started)

该文件开始易于理解,但它变得指数级复杂,如果他们提到的后面的任何一个例子与我的问题有关,我就很难解读。

2 个答案:

答案 0 :(得分:24)

您的类有两件事阻止Simple Injector自动连接您的DAL类:

  1. 您的班级有两个构造函数和
  2. 如果删除默认构造函数,则无法注入基本类型(如字符串)。
  3. Nemesv的评论几乎是正确的。您可以回退使用这样的委托注册:

    container.Register<IDAL>(() => new DAL("db"));
    

    This article描述了为什么你的应用程序组件应该只有一个构造函数。

答案 1 :(得分:1)

如果构造函数正在查找字符串值     container.Register(()=&gt; new DAL(&#34; db&#34;));

如果构造函数正在寻找另一个类

container.Register<IDAL>(() => new DAL(new class()));