2014-02-18 142 views
0

有什么办法从依赖注入器获取类的实例吗?实例化依赖注入类

例如,注册我的类型,然后有一个这样的类:

public class A { 
    private readonly Iinterface _object; 

    public A (Iinterface object) { 
     _object = object; 
    } 

    //do stuff using _object 
} 

public class B { 
    public void DoSomething() { 
     var instanceOfA = DIContainer.GetInstance(typeof(A)); 
     //do stuff with instanceOfA which has been constructed using DI 
    } 
} 

目前,我会注册类A将被注入,然后有注入到等级B的构造函数。我只是很好奇,如果有一种方法可以让我从Unity为我创建的A实例自动注入dependencies,所以我不必注册它或通过对象。

请记住,这不是我正在考虑的实际使用案例,但我想了解更多关于使用依赖注入和Unity的选项。

+1

'A'和'B'之间的关系是什么? 'A'可以将依赖注入到'B'中吗? –

+0

是的,这是我现在要做的,但我想知道是否有办法让'A'没有注入太多。 – tau

回答

4

在Unity中,有几种获取依赖关系的方法。

  1. 构造器注入
  2. 物业注射
  3. 手动解决

我相信你要求的是#3。

在你的榜样,你可以得到一类被实例(授予您已经注册Iinterface):

unityContainer.Resolve<A>(); 

一种简化的方式去思考统一是这是一个非常聪明的工厂,可以给你构造函数中的一个对象,属性或通过调用Method。询问任何对象类型或接口类型,它会给你一个。需要注意的是,你需要提供有关如何处理歧义的线索。这基本上就是注册起作用的地方。

在上例中,唯一的不明确之处是Iinterface,因此这是您需要注册的唯一类。解决类AB不需要任何注册,因为它已经是一个具体的类型。

+0

感谢您的解释。我与DI的经历让我相信大部分是你写的,但我很欣赏你简明扼要地解释了它,并确认了我相信的大部分内容。 – tau

1

这取决于AB之间的关系:

如果B取决于A,那么它将使意义A注入的依赖到B(或者注入A本身)。

我不会建议允许B通过查看A来“查找”依赖项。充其量,您最好在BA之间拥有强大的依赖关系,最糟糕的情况是最终会出现“服务定位器”反模式。

除非你有一个关键需要保持AB之间的依赖关系,否则我不会将它们连接在一起。

+0

我同意你的看法,但我想知道是否有可能'B'以某种方式创建'A'的注入依赖项的实例,而不是将'A'注入到它的构造函数中。 – tau

+0

这可能是可能的(我对Unity知之甚少),但它仍然创建了对A的依赖关系。如果_应该是对A的依赖关系,那么注入A或依赖关系是有效的。 –