当您可以在构造函数中初始化时,为什么需要显式 Initialize 方法?

Why is there a need for an explicit Initialize method when you can just initialize in the constructor?

我正在执行以下操作:

var vm = scope.CreateInstance<IBlaBla>();

vm.SetTitles("bla"); //anti pattern
vm.Initialize(foo, bar);

我被告知以上是反模式,因为我应该永远不会在调用 Initialize 方法之前调用另一个方法。因此,解决方案是将另一个参数传递给 Initialize 方法并使该方法执行 SetTitles 工作。

我可以理解这背后的逻辑,因为您想在对虚拟机执行任何操作之前确保它已正确初始化。但是为什么当我们创建一个新的虚拟机实例时,初始化工作不能完成呢?我不明白需要显式 Initialize 方法。什么时候会有优势?

如果你真的想确保视图模型总是在对它做任何事情之前被正确初始化你应该考虑将它的构造函数设为私有并提供一个工厂方法来创建它的一个实例初始化它:

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 方法。

你的问题"why can't the initialise work be done when we created a new instance of the VM?"

让我们假设一个 vm 声明为

var vm = new VM(){
    prop1 = "foo",
    prop2 = "bar"
};
vm.Initialise();

现在这里发生了什么

  1. 施工
  2. 配置
  3. 初始化

这意味着如果您在构造函数配置中进行初始化,则不会发生

将初始化与构造分开也使设计人员支持更容易,因为它可以创建用于反射的对象,这些对象 none 具有功能性,因此不太可能因依赖关系而崩溃

这也是设计器支持需要空构造函数的原因