我试图在我的架构中实现依赖注入(MVC,DDD - 域模型,存储库)。我的架构包括ASP.NET Identity 2.0。
在这个阶段,我不希望DI控制任何Identity 2.0对象(UserAdminController,RolesAdminController ......)。我更喜欢DI之外的安全对象。在这个阶段,将标识对象集成到DI中看起来非常困难。我好好看看是否有人已经这样做了,所以我可以阅读并学习如何做到这一点。我找不到任何东西。 (找到一篇贴近但没有解决的帖子。)
无论如何,我已经按照Simple Injector MVC实现(参见下面的标准代码),尝试了很多东西,我相信问题在于我调用 RegisterMvcControllers 。
如果我错了,请纠正我,但是此声明将使用" controller"来修复所有控制器的名称后。
问题:如何选择使用Simple Injector注册哪些控制器? (这称为手动注册吗?)
我将非常感谢任何帮助,因为我今天大部分时间都在试图解决所有问题,然后继续下一步,即实施DI,并实例化我的对象。
...
...
...从Application_Start()
调用 // Create a Simple Injector container
var container = new Container();
// Configure the container
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
// Verify the container's configuration
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
private static void InitializeContainer(Container container)
{
container.Register<MyService1>();
container.Register<IMyRepositoryA, MyRepositoryA>();
// Trying to include Identity into Simple Injector - please ignore
container.Register<IUserStore<ApplicationUser>>(() => new UserStore<ApplicationUser>(new ApplicationDbContext()));
}
答案 0 :(得分:6)
RegisterMvcControllers
将注册以下类型:
System.Web.Mvc.IController
您可以看到here in the source code会发生什么。
RegisterMvcControllers
扩展方法调用SimpleInjectorMvcExtensions.GetControllerTypesToRegister
方法来获取要注册的控制器列表。您可以自己调用该方法以查看注册的内容如下:
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly())
因此,您可以通过调用RegisterMvcControllers
方法自行注册控制器,而不是调用GetControllerTypesToRegister
:
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly());
foreach (var controllerType in registeredControllerTypes)
{
container.Register(controllerType, controllerType, Lifestyle.Transient);
}
通过这种方式,您可以过滤掉要手动注册的任何控制器:
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly())
.Where(type => type.Name != "UserStore`1");
foreach (var controllerType in registeredControllerTypes)
{
container.Register(controllerType, controllerType, Lifestyle.Transient);
}
另一种选择是覆盖注册:
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Options.AllowOverridingRegistrations = true;
container.Register<IUserStore<ApplicationUser>>(
() => new UserStore<ApplicationUser>(new ApplicationDbContext()))
// Always set the option back to false ASAP to prevent configuration errors.
container.Options.AllowOverridingRegistrations = false;