Unity注册实例并解决

时间:2010-02-05 07:24:39

标签: c# exception-handling dependency-injection unity-container

我写了一个类,它有一些从Unity容器中解析出来的依赖项。

从我的主课程中我创建了一个新对象

MyObject myObject = new MyObject();

我用Unity Container注册它

UContainer.RegisterInstance<MyObject>(myObject, new ExternallyControlledLifetimeManager());

我创建了需要它作为依赖的类型

ConsumerObject consumer = new ConsumerObject();

消费者看起来像这样:

public class ConsumerObject
{
    public ConsumberObject()
    {
         theObject = (MyObject)UContainer.Resolve(typeof(MyObject));    
    }
}

这引发了一个例外:

  

依赖项的解析失败,type =“MyObject”,name =“”。异常消息是:当前构建操作(构建密钥Build Key [MyObject,null])失败:尝试调用构造函数MyObject(IPreferenceStorageProvider pp)时无法解析参数pp。 (策略类型BuildPlanStrategy,索引3)

为什么我的解决方案会尝试在该类型上调用另一个contsructor?我已经创建了它并注册了实例..我也尝试过:theObject = UContainer.Resolve<MyObject>();似乎没有任何区别..

由于

4 个答案:

答案 0 :(得分:10)

我认为问题在于您使用的是ExternallyControlledLifetimeManager。在这种情况下,Unity容器仅包含对您的实例的弱引用。当您尝试解决时,您的实例已经被垃圾收集了。这就是为什么.RegisterInstance()的默认LifeTimeManager是ContainerControlledLifeTimeManager。 而Darrel Miller的案例也有效,因为它还没有GC编辑。 尝试以这种方式注册您的实例:

UContainer.RegisterInstance<MyObject>(myObject);

答案 1 :(得分:3)

我不确定你为什么会看到你的行为。我刚刚创建了一个复制你的场景的测试,它运行良好。

你有没有试过这样的东西,

public class ConsumerObject
{
    public ConsumberObject(MyObject myObject)
    {
         theObject = myObject
    }
}

然后使用UContainer.Resolve<MyObject>()

我唯一能想到的是当你访问UContainer.RegisterInstance然后UContainer.Resolve时你实际上访问了两个不同的容器。你能告诉我们你是如何宣布UContainer的吗?

答案 2 :(得分:1)

据我所知,Unity尝试(默认情况下)调用具有最大参数数量的构造函数,并尝试从映射中解析每个参数。 您需要添加IPreferenceStorageProvider的映射,或者删除需要此参数的构造函数。

如果您不希望通过unity注入IPreferenceStorageProvider参数,则可能根本不应将其声明为构造函数参数。您可以在默认构造函数中硬编码此对象的实例化。

答案 3 :(得分:0)

&#34;为MyObject&#34;是一种实现我认为的接口的类型。 尝试注册界面而不是实际实现。

类似的东西:

UContainer.RegisterInstance<IMyObject>(myObject, new ExternallyControlledLifetimeManager());

此外,如果你有多个相同的interfeace实现,不要忘记在注册时命名它们,除非你想覆盖已经注册的实现。

如需进一步帮助,建议您访问msdn:

https://msdn.microsoft.com/en-us/library/ff648449.aspx