私は現在、UnityとCaliburnMicroを使用してMVVMを実装する方法を学ぼうとしています。他の場所で助けを探した後、コンストラクタインジェクションを適切に設定する方法がまだわかりません。MVVMやその他の専門知識が不足しているために、これが機能していないかどうかはわかりません。
私の問題は、ユーザーがボタンをクリックしたときにナビゲートできる2つのIScreenオブジェクトをメインウィンドウ(シェル)クラスに渡したいことです。MainWindowViewModelクラスのコンストラクターのコードは次のとおりです。
private IScreen campaignViewModel, stringsViewModel;
public MainWindowViewModel(IScreen campaignViewModel, IScreen stringsViewModel)
{
this.campaignViewModel = campaignViewModel;
this.stringsViewModel = stringsViewModel;
ActiveItem = this.campaignViewModel;
}
これは、Bootstrapper(Unity)クラスで使用しているコードです。
private static IUnityContainer BuildContainer()
{
IUnityContainer result = new UnityContainer();
result
.RegisterInstance(result)
.RegisterInstance<IWindowManager>(new WindowManager())
.RegisterInstance<IEventAggregator>(new EventAggregator());
result
.RegisterType<IScreen, CampaignsViewModel>()
.RegisterType<IScreen, StringsViewModel>()
.RegisterType<MainWindowViewModel>(new InjectionConstructor(typeof(IScreen), typeof(IScreen)));
return result;
}
protected override object GetInstance(Type service, string key)
{
var result = unity.Resolve(service, key);
if (result == null)
throw new Exception(string.Format("Could not locate any instance of contract {0}", service));
return result;
}
これを実行すると、MainWindowViewModelはStringsViewModelの2つのインスタンスを受け取ります。ただし、ステートメントにキーを入れる場合は、次のようになります。
result.RegisterType<IScreen, StringsViewModel>("StringsView");
次に、CampaignsViewModelの2つのインスタンスを渡します。CampaignViewModelとStringsViewModelの1つのインスタンスで渡すようにInjectionConstructorに指定する方法がわかりません。GetInstanceメソッドと関係があるのではないかと思いますが、よくわかりません。
どんな助けでも大歓迎です!
ありがとう。