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

时间:2015-08-24 18:18:43

标签: c# wpf constructor dependency-injection unity-container

我在我的应用程序中使用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);
    }
}

这似乎是依赖注入模式中非常常见的情况。我担心为什么我在这个问题上找不到多少。

1 个答案:

答案 0 :(得分:2)

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

根据您的评论...

  

在统一解析课程时,我不知道工作表需要什么ID。

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

如果我误解了您的评论,那么您可能需要考虑创建它:

struct WorksheetId
{
    int Id;
}

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