为什么Unity找不到我的参数化构造函数?

时间:2017-01-13 07:16:18

标签: c# wpf dependency-injection unity-container

我的小新手Bootstrapper按如下方式配置容器:

protected override void ConfigureContainer()
{
    base.ConfigureContainer();
    RegisterTypeIfMissing(typeof(IUserSettingsProvider), typeof(JsonUserSettingsProvider), true);
    RegisterTypeIfMissing(typeof(IAppState), typeof(AppState), true);
    Container.RegisterType<TripleDesEncryptionService>(new InjectionConstructor(App.CryptoKey));
    Container.RegisterType<BaseViewModel>(new InjectionConstructor(Container.Resolve<IAppState>()));
}

我的BaseViewModel只有一个ctor:

public abstract class BaseViewModel : BindableBase, INotifyPropertyChanged
{
    protected BaseViewModel(AppState appState)
    {
        AppState = appState;
    }
    ...
}

当我尝试运行项目时,引导程序在RegisterType<BaseViewModel>上失败并抛出以下异常。

  

System.InvalidOperationException:'类型   ApptEase.Client.Infrastructure.ViewModels.BaseViewModel没有   获取参数(AppState)的构造函数。'

AppState已在应用程序启动代码中创建并注册到容器中:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    var boot = new Bootstrapper();
    boot.Run();
    Container = boot.Container;
    _appState = new AppState();
    Container.RegisterInstance(typeof(AppState), _appState);
}

1 个答案:

答案 0 :(得分:0)

您的BaseViewModel类构造函数受到保护。这对Unity来说是不可见的。但无论如何,正如用户3615在评论中所写 -

  

由于无法创建实例,因此无法解析抽象类

所以我建议明确注册一个具体的实现实例并将其映射到该基类型。

Container.RegisterInstance(typeof(BaseViewModel), new MyConcreteViewModel());

但最终你想要的实际上是界面类型注册。这可以通过模拟解锁可测试性。