asp.net-mvc - 简单的注入(inject)器手动注册 Controller

标签 asp.net-mvc dependency-injection simple-injector

我正在尝试将依赖注入(inject)实现到我的架构(MVC、DDD - 域模型、存储库)中。我的架构包括 ASP.NET Identity 2.0。

在此阶段,我不希望 DI 控制任何 Identity 2.0 对象(UserAdminController、RolesAdminController...)。我更喜欢 DI 之外的安全对象。在这个阶段,将 Identity 对象集成到 DI 中看起来非常困难。我仔细看看是否有人已经这样做了,所以我可以阅读并学习如何做到这一点。我什么也没找到。 (发现一篇文章很接近,但没有解决方案)。

无论如何,我遵循了 Simple Injector MVC 实现(请参阅下面的标准代码),并尝试了很多事情,我相信问题出在我调用 RegisterMvcControllers 上。

如果我错了,请纠正我,但此语句将拾取所有名称后缀为“controller”的 Controller 。

问题:如何选择向 Simple Injector 注册哪些 Controller ? (这叫手动注册吗?)

任何帮助将不胜感激,因为我今天大部分时间都在试图理解这一切,并继续下一步,即实现 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
  • 类型不能是抽象的
  • 该类型不得是泛型类型定义
  • 其名称必须以“Controller”结尾

您可以看到发生了什么 here in the source code .

RegisterMvcControllers 扩展方法调用 SimpleInjectorMvcExtensions.GetControllerTypesToRegister 方法来获取要注册的 Controller 列表。您可以自己调用该方法来查看注册的内容,如下所示:

var registeredControllerTypes =
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())

因此,您可以通过调用 GetControllerTypesToRegister 方法自行注册 Controller ,而不是调用 RegisterMvcControllers:

var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly());

foreach (var controllerType in registeredControllerTypes)
{
    container.Register(controllerType, controllerType, Lifestyle.Transient);
}

这样您就可以过滤掉您想要手动注册的任何 Controller :

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;

关于asp.net-mvc - 简单的注入(inject)器手动注册 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25009895/

相关文章:

c# - 使用简单注入(inject)器解析通用装饰器

c# - 使用简单注入(inject)器在静态类中进行属性注入(inject)

javascript - 将元素大小调整为另一个元素大小的最佳方法

php - 用PHP反转控制

c# - 无法在 .NET Core 2.0 的启动构造函数中注入(inject)我自己的对象

c# - 使用 Ninject 的 .NET MVC 依赖注入(inject)

c# - 使用 Simple Injector 和 IHttpControllerActivator 解决 ASP.NET Web API 中的依赖关系

javascript - 为 Knockoutjs 和映射器扩展添加记录功能

c# - 无法在 MVC 项目 Visual Studio 2015 中打开数据库

c# - 如何在 mvc4 中使用旧式 sql