ICommand
ViewModel にを注入する正しい方法を理解しようとしています。
私のViewModelが次のようになっていると仮定します。
public class ViewModel : IViewModel
{
ICommand LoadCommand { get; }
ICommand SaveCommand { get; }
}
私は現在、コンストラクターでこれを行っています
public ViewModel(IRepository repository, IErrorLog errorLog, IValidator validator)
{
LoadCommand = new LoadCommandImpl(repository, errorLog);
SaveCommand = new SaveCommandImpl(repository, errorLog, validator);
}
コマンドの作成を除いて、パラメーターはViewModelではまったく使用されないことに注意してください。
挿入されたインターフェイスにできるだけ多くのロジックを含めるようにしていますが、コマンドにはまだロジックがあります。
これを行う方が適切と思われます
public ViewModel(ICommand loadCommand, ICommand saveCommand)
{
LoadCommand = loadCommand;
SaveCommand = saveCommand;
LoadCommand.SetViewModel(this);
SaveCommand.SetViewModel(this);
}
ただし、これを行うには、Unityの登録をこのようにする必要があります。これは世界の終わりではありませんが、それは苦痛のようです。
container.RegisterType<ICommand, LoadCommandImpl>("loadCommand");
container.RegisterType<ICommand, SaveCommandImpl>("saveCommand");
container.RegisterType<IViewModel, ViewModel>(
new InjectionConstructor(
new ResolvedParameter<ICommand>("loadCommand"),
new ResolvedParameter<ICommand>("SaveCommand")));
または、インターフェイスを作成することもできILoadCommand
ますISaveCommand
が、これらのインターフェイスは空であるか、を実装する可能性がありますICommand
。
私はこれらのソリューションの大ファンではありません。ここで推奨されるアプローチは何ですか?
ブラインドメイスに応じて編集する
これがコマンド以外のものであると少し考えてみましょう。
public ViewModel(IFoo foo)
{
Bar = new Bar(foo);
}
私の意見では、IBarを注入する方が適切でしょう。
public ViewModel(IBar bar)
{
Bar = bar;
}
しかし今、私はとを持っBar1
ていBar2
ます。だから私はどちらかを行うことができます
public ViewModel(IFoo foo)
{
Bar1 = new Bar1(foo);
Bar2 = new Bar2(foo);
}
また
public ViewModel(IBar bar1, IBar bar2)
{
Bar1 = bar1;
Bar2 = bar2;
}