【发布时间】:2017-04-17 09:34:25
【问题描述】:
我使用Simple Injector 来享受注射乐趣。
据我所知,我只在我的引导程序项目中注册和解析我的容器。
所以我的控制台应用程序中有这段代码:
static void Main(string[] args)
{
Container container = ComposeRoot();
var controller = container.GetInstance<IBussinesLogicController>();
controller.Execute();
Console.WriteLine("Started");
Console.ReadLine();
}
private static Container ComposeRoot()
{
var container = new Container();
//Bussines Logic controllers.
container.Register<IBussinesLogicController, BussinesLogicController>(Lifestyle.Singleton);
container.Register<IStationController, StationController>(Lifestyle.Transient);
//Data Access controllers.
container.Register<IDataAccessController, DataAccessController>(Lifestyle.Singleton);
container.Register<IDirectoryStructureController, DirectoryStructureController>(Lifestyle.Singleton);
//Shared controllers.
container.Register<ILogger, LoggerController>(Lifestyle.Singleton);
container.Verify();
return container;
}
这将解析我的业务逻辑控制器并调用 Execute。
现在在执行中,我想解析 IStationController 的 10 个新实例并将它们添加到列表中。
var stations = new List<IStationController>();
for (int i = 0; i < 10; i++)
{
//Resolve IStationController here...
//IStationController station = diContainer.GetInstance<IStationController>();
//station.StationName = $"Station {i}";
//stations.Add(station);
}
我怎样才能正确地做到这一点,因为我的业务逻辑项目不允许也不允许引用依赖容器?
我可以通过将依赖项添加到容器来轻松解决此问题,但恐怕我没有遵循正确的模式。
我的解决方案布局如下:
- 类库 (DAL)
- 类库 (BLL)
- 类库(模型)
- 类库(记录器)
- 控制台应用程序 (ConsoleApp6)
请让我知道解决此问题的正确方法是什么。
谢谢!
【问题讨论】:
-
您的业务逻辑不能将引用调用为 DI 容器,重要的是要了解业务或其他层需要
StationController的位置。您可以创建一个工厂,它在内部调用 DI 容器 -
嗨 Mrinal Kamboj 好的,但是这个工厂将再次出现在我的 bussineslogic 实现中,并且不会引用 DI 容器,您能否举例说明您的意思。此时只有引导应用程序(控制台应用程序)对 DI 容器有引用。
-
检查我的答案,只有Factory有对DI容器的引用,没有调用者/业务层/控制台应用程序
-
StationController是什么类型的对象?我假设包含应用程序行为(因为您在控制器中注册了它),但我注意到它包含一个名为StationName的可变属性,这对于组件来说很奇怪。组件通常应该是不可变的,它们不应该需要runtime data (a name) during construction。您能否详细说明StationController是什么,为什么它有名字,以及为什么要创建它们的列表?它是一个组件,还是其他东西,例如实体或 DTO? -
@Steven 请注意,所有这些都是用于学习 Simple Injector 框架的测试代码,详细说明,StationController 是一个控制器,它将读取某个目录并使用(解析)任何 xml里面的文件,你如何将这个站名信息注入这个类?
标签: c# design-patterns dependency-injection inversion-of-control ioc-container