我希望做到与此相同:
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
但是在控制台应用程序中。我也有需要以工人角色执行此操作的情况。我不想在整个地方添加对MVC dll的引用。我想知道是否有非mvc项目的等价物?我需要存储我创建的容器,以便我可以在整个应用程序中访问它。我想过创建一个静态变量,但我宁愿不这样做。
我看到Simple Injector有一个CommonSerivceLocator nuget,但奇怪的是它需要2.8.1而最新的非mvc Simple Injector是2.8.0。
答案 0 :(得分:2)
我不想在整个地方添加对MVC dll的引用。
这表示您没有应用依赖注入,但正在执行Service Location,这是anti-pattern。
如果对所有组件应用构造函数注入,您将能够让Simple Injector构建一个完整的依赖组件对象图(深层次),而不需要任何组件来了解IoC容器的存在例如Simple Injector或IoC抽象,例如Common Service Locator和MVC IDependencyResolver
。这可以防止您“在所有地方”引用您的IoC容器或此类抽象。
因此,在控制台应用程序中,这意味着您通常只有一个地方可以解析对象图。这是应用程序中已经知道IoC容器存在的地方。这个地方通常被称为Composition Root。
我看到Simple Injector有一个CommonSerivceLocator nuget,但奇怪的是它需要2.8.1而最新的非mvc Simple Injector是2.8.0。
我似乎在创建NuGet包的构建脚本中出错,虽然NuGet通常在上传包时应用检查,但由于某种原因它无法检查这一点。我解决了这个问题,并将CommonServiceLocator适配器的v2.8.2推送到了NuGet。但请注意,我们在Simple Injector的v3中放弃了对CSL适配器的支持,因为它导致了不好的做法。不要用它;你不需要它。