使用依赖注入时为 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
作为依赖项。
我在我的应用程序中使用 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
作为依赖项。