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

本文关键字:设置 依赖 注入 | 更新日期: 2023-09-27 18:09:40

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

例如,我的WorksheetViewModel是:

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

这个效果很好。但是,当我准备显示我的工作表时(从另一个视图,而不是应用程序根视图),我需要向它发送它的工作表id,以便它可以初始化自己。

是否有办法在构造函数中做到这一点?这似乎是不可能的,因为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不是依赖项。

根据你的评论…

在unity解析类的时候,我还不知道工作表需要什么ID。

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

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

struct WorksheetId
{
    int Id;
}

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