2017-01-13 9 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は一つだけ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

インスタンスを作成できないため、抽象クラスを解決できません – 3615

+4

さらに、publicコンストラクタもありません。 –

+0

@ 3615抽象クラスを解決したくありませんが、すべてのサブクラスに対してctor注入が必要です。 – ProfK

答えて

0

あなたBaseViewModelクラスのコンストラクタは保護されています。 Unityには見えません。しかし、いずれにせよ、ユーザーとして3615は、コメントに書いた - インスタンスが

を作成することはできませんので、

あなたはだから私は具体的な実装のインスタンスを登録し、その基本型にマッピング明示的に示唆している抽象クラスを解決することはできません。

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

最終的には、実際にはインターフェイスタイプの登録です。これにより、模擬テストによってテスト容易性が解かれます。

+0

私は保護されたコンストラクタでUnityなしの 'AppState'を解決しました。それは簡単な細部であり、多くのテストには関与しません。 – ProfK

関連する問題