使用依赖注入时为 class 设置初始值

Setting initial values for class when using Dependency Injection

我在我的应用程序中使用 unity 进行依赖注入。根据最佳实践,只有我的应用程序的根知道关于 UnityContainer 的任何信息,其他所有内容都在链中解析。

例如我的WorksheetViewModel是:

public WorksheetViewModel(CollateralEditViewModel collateralEditViewModel,
                          AddCollateralToWorksheetViewModel addCollateralToWorksheetViewModel,
                          CollateralWorksheetsViewModel collateralWorksheetsViewModel,
                          Publisher<RequestEventArgs> freaPublisher,
                          IWorksheetLogic worksheetLogic)

这很好用。但是,当我准备好显示我的工作表时(从另一个视图,而不是应用程序根目录),我需要将其 worksheetID 发送给它,以便它可以自行初始化。

有没有办法在构造函数中做到这一点?这似乎不可能,因为 WorksheetViewModel 已经构建。这里的通用模式是不是只是用另一种方法作为伪构造函数?即

public void InitializeWorksheetWithID(int ID)

或者有比 DI 更好的方法吗?

更新

也许我需要更多信息。想象一下打开 WorksheetViewModel 的人看起来像:

public class MyOtherViewModel
{
    private WorksheetViewModel _worksheetViewModel;

    public MyOtherViewModel(WorksheetViewModel worksheetViewModel)
    {
         _worksheetViewModel = worksheetViewModel;
    }

    public void SomeActionPerformedByUser(object sender, MyEventArgs e)
    {
         var worksheetID = e.ID;
         _worksheetViewModel.InitializeWorksheetWithID(worksheetID);

         DoStuffToDisplayView(_worksheetViewModel);
    }
}

这似乎是依赖注入模式中非常常见的场景。我很担心为什么我找不到太多关于这个主题的东西。

最简单的选择是像您提到的那样创建一个 setter。 方法有很多,但这是最简单的。 您已选择将 Unity 用作 DI 容器,因此您的构造函数用作依赖项连接代码。 ID 不是依赖项。

根据您的评论...

At the time that unity resolves the class, I don't know what ID the worksheet will need yet.

...我认为可以安全地假设可能存在没有 ID 的有效工作表,因此 ID 不是构建时的问题。

如果我误解了你的评论,那么你可能要考虑创建这个:

struct WorksheetId
{
    int Id;
}

并在构造函数中添加 WorksheetId 作为依赖项。