我正在执行以下操作:
var vm = scope.CreateInstance<IBlaBla>();
vm.SetTitles("bla"); //anti pattern
vm.Initialize(foo, bar);
我被告知以上是一个反模式,因为在调用初始化方法之前,我应该从不调用另一种方法。因此,解决方案是将另一个参数传递给初始化方法,并使该方法进行设置工作。
我可以看到此背后的逻辑,因为您想在对其进行任何操作之前确保VM适当初始化。但是,当我们创建VM的新实例时,为什么不能完成初始工作?我不明白需要明确的初始化方法。什么时候这是一个优势?
如果您真的想确保查看模型是始终在使用它之前正确初始初始化的两者都创建了它的实例,将其初始化:
public class ViewModel
{
private ViewModel(string title)
{
Title = title;
}
public string Title { get; private set; }
public static ViewModel CreateAndInitialize(string title)
{
return new ViewModel(title);
}
}
然后,您将始终拥有一个属性初始化的实例:
ViewModel vm = ViewModel.CreateAndInitialize("...");
如果视图模型是异步初始化的,则此方法特别有用:
public static async Task<ViewModel> CreateAndInitializeAsync(string title)
{
await Task.Delay(2000); //do some init work...
return new ViewModel(title);
}
ViewModel vm = await ViewModel.CreateAndInitializeAsync("...");
否则,您通常可以在视图模型的构造函数中进行初始化,然后您根本不需要任何Initialize
方法。
您的问题"为什么当我们创建VM的新实例时不能完成初始工作?"
让我们假设一个VM称为
var vm = new VM(){
prop1 = "foo",
prop2 = "bar"
};
vm.Initialise();
现在这里发生了什么
- 施工
- 配置
- 初始化
这意味着如果您在构造函数配置内部初始化,则不会发生
保持初始化与构造分开也使设计师支持变得更加容易,因为它可以为反射的对象创建无功能,因此由于依赖关系而崩溃的可能性较小
这也是为什么设计师支持需要空的构造函数