我试图在我的架构(MVC,DDD-Domain Model,Repository)中实现依赖注入。我的架构包括ASP.NET 身份2.0。

在这个阶段,我不希望控制任何Identity2.0对象(UserAdminController,RolesAdminController。..).我更喜欢DI之外的安全对象。在这个阶段,在DI中整合身份对象看起来非常困难。我有一个很好的外观,看看是否有人已经做到了这一点,所以我可以阅读并学习如何做到这一点。我什么也找不到。(找到了一个接近的帖子,但没有解决方案)。

无论如何,我已经遵循了简单的Injector MVC实现(请参阅下面的标准代码),并尝试了很多事情,我相信问题在于我。 Registermvc控制器.

纠正我,如果我错了,但这种说法将拾取所有控制器与他们的名字后固定与"控制器"。

问题:如何选择使用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()));
    }
有帮助吗?

解决方案

RegisterMvcControllers 将注册以下类型:

  • 类型必须是public
  • 类型必须实现 System.Web.Mvc.IController
  • 类型不能是抽象的
  • 类型不能是泛型类型定义
  • 其名称必须以"控制器"结尾

你可以看到会发生什么 在这里的源代码.

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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top