Unity注册实例并解决

gav*_*ens 7 c# dependency-injection exception-handling unity-container

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

从我的主类我创建一个新对象

MyObject myObject = new MyObject();
Run Code Online (Sandbox Code Playgroud)

我用我的Unity容器注册它

UContainer.RegisterInstance<MyObject>(myObject, new ExternallyControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)

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

ConsumerObject consumer = new ConsumerObject();
Run Code Online (Sandbox Code Playgroud)

消费者看起来像这样:

public class ConsumerObject
{
    public ConsumberObject()
    {
         theObject = (MyObject)UContainer.Resolve(typeof(MyObject));    
    }
}
Run Code Online (Sandbox Code Playgroud)

这引发了一个异常:

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

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

谢谢

小智 11

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

UContainer.RegisterInstance<MyObject>(myObject);
Run Code Online (Sandbox Code Playgroud)


Pan*_*nek 1

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

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

  • 问题是“MyObject”不是我的对象。它有大约 15 个构造函数。我可以创建它,但我无法控制它的结构。为什么 Unity 无论如何都要尝试更新它?我创建了一个实例并注册了它..它现在作为单例位于容器中,它不应该调用任何构造函数..??? (2认同)