C# 使用依赖项注入时为类设置初始值

C# 使用依赖项注入时为类设置初始值,c#,wpf,constructor,dependency-injection,unity-container,C#,Wpf,Constructor,Dependency Injection,Unity Container,我在应用程序中使用unity进行依赖注入。根据最佳实践,只有我的应用程序的根用户知道有关UnityContainer的任何信息,其他所有信息都会在链的下游解决 例如,我的工作表viewmodel是: public WorksheetViewModel(CollateralEditViewModel collateralEditViewModel, AddCollateralToWorksheetViewModel addCollateralTo

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

例如,我的
工作表viewmodel
是:

public WorksheetViewModel(CollateralEditViewModel collateralEditViewModel,
                          AddCollateralToWorksheetViewModel addCollateralToWorksheetViewModel,
                          CollateralWorksheetsViewModel collateralWorksheetsViewModel,
                          Publisher<RequestEventArgs> freaPublisher,
                          IWorksheetLogic worksheetLogic)
还是有比DI更好的方法

更新

也许我需要更多的信息。想象一下打开
工作表viewmodel
的人的样子:

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。 有很多方法,但这是最简单的。 您已经选择像DI容器一样使用Unity,因此您的构造函数充当依赖项连接代码。
ID
不是依赖项

根据你的评论

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

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

如果我误解了你的评论,那么你可能想考虑一下:
struct WorksheetId
{
    int Id;
}

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

在应用程序的“根”中初始化工作表时,如何传递WorksheetId?如果需要从根目录初始化工作表,我可以添加
int ID
参数并将其注入Unity。目前,我从不从根目录初始化工作表,只从其他视图初始化工作表。根目录基本上是一个搜索仪表板。我有相当多的视图是以这种方式实例化的,为什么不对其中一个视图执行相同的操作呢?在中可以有多个视图。在unity解析类时,我还不知道工作表需要什么ID。除非我不明白你的意思。如果我是,举个例子就好了。谢谢@dss539。我添加了一些信息,如果这有助于使我的情况更清楚的话。@Jonesopolis您的更新让我非常清楚,该对象可能存在而没有ID。我认为您的第一反应是正确的,您只需要一个方法来设置ID。@dss539是正确的。工作表TID是运行时数据,不应与构造函数注入混合。提到的
WorksteetId
struct称为提供者。您在问题更新中提到的解决方案称为接口注入或方法注入。在我看来,这种数据应该通过方法调用在系统中流动。有关链接,请参见answerThank@Ric.Net。那家伙的问题措辞比我好得多。我对这种方法感到舒服多了。谢谢@dss539!
struct WorksheetId
{
    int Id;
}