我写了一个类,它有一些从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>();
似乎没有任何区别..
由于
答案 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: