我在我的应用程序中使用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);
}
}
这似乎是依赖注入模式中非常常见的情况。我担心为什么我在这个问题上找不到多少。
答案 0 :(得分:2)
最简单的选择是创建一个像你提到的setter。
有很多方法,但这是最简单的方法。
您选择使用Unity作为DI容器,因此您的构造函数用作依赖性接线代码。
ID
不是依赖项。
根据您的评论...
在统一解析课程时,我不知道工作表需要什么ID。
......我认为可以安全地假设有效的工作表可能没有ID,因此ID不是构造时间问题。
如果我误解了您的评论,那么您可能需要考虑创建它:
struct WorksheetId
{
int Id;
}
在构造函数中添加WorksheetId
作为依赖项。