【发布时间】:2017-05-12 02:49:44
【问题描述】:
我正在使用 Unity 开发一个 MVC-ish(可能更像 MVP)桌面应用程序,它有一个主 UI 线程并定期在后台运行异步任务。主窗口的 UI 事件由MainController 处理。当用户打开一个新窗口时,MainController 将创建一个新的子控制器并传入它需要的任何依赖项。当主窗口中的计时器计时,它会调用MainController 上的一个方法,该方法会启动一个异步任务。 MainController 有任务同步,所以我一次运行的aysnc 任务不超过一个。
我将两个服务外观和异步任务调度程序注入MainController。这两个服务门面有一个服务,它们各自依赖。
外观服务和任务调度服务如下所示:
public class FacadeOne : IFacadeOne
{
private readonly IFirstService firstService;
private readonly ISecondService secondService;
public FacadeOne(IFirstService firstService, ISecondService secondService)
{
this.firstService = firstService;
this.secondService = secondService;
}
}
public class FacadeTwo : IFacadeTwo
{
private readonly IFirstService firstService;
private readonly IThirdService thirdService;
public FacadeTwo(IFirstService firstService, IThirdService thirdService)
{
this.firstService = firstService;
this.thirdService = thirdService;
}
}
public class TaskScheduler : ITaskScheduler
{
private readonly IFacadeOne facadeOne;
private readonly IFacadeTwo facadeTwo;
public TaskScheduler(IFacadeOne facadeOne, IFacadeTwo facadeTwo)
{
this.facadeOne = facadeOne;
this.facadeTwo = facadeTwo;
}
}
MainController 看起来像这样
public class MainController
{
private readonly IFacadeOne facadeOne;
private readonly IFacadeTwo facadeTwo;
private readonly ITaskScheduler taskScheduler;
public MainController(IFacadeOne facadeOne, IFacadeTwo facadeTwo, ITaskScheduler taskScheduler)
{
this.facadeOne = facadeOne;
this.facadeTwo = facadeTwo;
this.taskScheduler = taskScheduler;
}
}
FacadeOne 和 FacadeTwo 都依赖于 FirstService。
在我的组合根目录中,我创建了一个MainController 的实例。当我创建该实例时,我希望发生以下情况 (here is a diagram which hopefully makes it clearer):
-
MainController的facadeOne和facadeTwo参数应该使用相同的ServiceOne实例。 - 解析时传递给
taskScheduler参数的facadeOne和facadeTwo参数应该与传递给MainController的构造函数的facadeOne和facadeTwo参数不同。 - 解析
taskScheduler参数时,其facadeOne和facadeTwo参数应该使用相同的FirstService实例,但它应该是与MainController使用的实例不同的实例sfacadeOne和facadeTwo参数。 - 当
taskScheduler参数被解析时,它的facadeOne和facadeTwo参数应该使用与@987654360 使用的实例不同的SecondService和ThirdService实例(还有FirstService,如上所述) @ 的facadeOne和facadeTwo参数。
有没有一种简单的方法可以在 Unity 中使用生命周期管理器来执行此操作,而不是创建一个复杂且容易出错的 Resolves、RegisterInstances 和临时变量序列?
【问题讨论】:
-
"...best way..." 受制于意见,可悲的是,SO 偏离主题。 How to Ask
-
我更新了问题。
-
我会将问题重命名为“Resolving instances with mix of TransientLifetimeManager 和 ContainerControlledLifetimeManager。”,但由于这是一个巨大的变化,如果您愿意,我会让您这样做!跨度>
-
如this article 中所述,您正在创建一个“复杂对象图”。在这些情况下,DI 容器不能很好地工作。 Pure DI 是要走的路。
标签: c# dependency-injection unity-container