不能在构造函数中使用Unity依赖

本文关键字:Unity 依赖 构造函数 不能 | 更新日期: 2023-09-27 18:06:07

我遇到了一个问题,我似乎找不到解决方案,只是因为我不明白如何修复这个NullReferenceException。

我有了构造函数;

public MainViewModel()
{
    this.Refresh = new DelegateCommand(this.DoRefresh);
    //...More like this...
    //...and finally...
    this.InitializeObjects();
}

那么在属性之间就会有依赖

[Dependency]
public IUnityContainer Container { get; set; }

最后是initializeobjects方法在'Container'上生成NullReferenceException

private void InitializeObjects()
{
using (var context = this.Container.Resolve<IDbContextScope>())
{
    //...remainder of the method...
}
}

在代码块的第3行抛出异常,即以'using (var…'开头的行

异常是ArgumentNullException;

Message "Value cannot be nul.Parameter name: container"
Source = Microsoft.Practices.Unity
StackTrace = at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve....etc..

所以我的具体问题是;它确实是IUnityContainer容器抛出异常?为什么会抛出异常?我该如何解决这个问题?

编辑:

在帖子下面的前2/3的评论中发现,断言了NullReferenceException的原因。然而,我仍然不知道如何围绕它工作,因为我没有体验到这是你每天的NRE。需要容器的函数用于初始化程序需要实现的值,因此需要在构造函数内部调用。我想我不能只是声明依赖关系,所以我如何工作围绕这个…?

不能在构造函数中使用Unity依赖

像这样的依赖属性的问题

[Dependency]
public IUnityContainer Container { get; set; }

是它们在构造函数中不可用。如果必须在构造函数中使用此值,请使用构造函数依赖项

public MainViewModel(IUnityContainer muhContainer, SomeOtherDependency derp)
{
    // use muhContainer and derp here
}

一般来说,如果你的对象必须有依赖,它应该通过构造函数注入来提供。如果你的依赖项有一个可接受的默认值,但你可能想在运行时通过配置进行更改,那么属性注入是可以的。

[Dependency]
public Herp WhoCares 
{
    get { return _herp ?? _defaultHerpDoesntMatterLol; }
    set { _herp = value; }
}