我试图弄清楚将一个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;
}