2017-01-13 56 views
0

我的小,新手,Bootstrapper配置容器如下:爲什麼Unity找不到我的參數化構造函數?

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只有一個構造函數:

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

你不能解析抽象類,因爲無法創建實例 – 3615

+4

加上它沒有公共構造函數... –

+0

@ 3615我不想解析抽象類,但我想要ctor注入它的所有子類。 – ProfK

回答

0

你BaseViewModel類的構造函數是受保護的。 Unity不可見。但無論如何,作爲用戶3615寫了評論 -

無法解決抽象類,因爲實例不能創建

所以我建議明確登記具體的實施實例,將其映射到基本類型。

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

但最終你想要的是一個接口類型的註冊。通過嘲諷解鎖可測試性。

+0

我最終在一個受保護的構造函數中解析了沒有Unity的'AppState'。這是一個微不足道的細節,不會影響很多測試。 – ProfK

相關問題