简单注入器手动注册控制器。

4
我正在尝试将依赖注入引入到我的架构中(MVC,DDD-域模型,存储库)。我的架构包括ASP.NET Identity 2.0。在这个阶段,我不希望DI控制任何Identity 2.0对象(UserAdminController,RolesAdminController等)。我更喜欢将安全对象放在DI之外。目前整合Identity对象到DI看起来非常困难。我已经仔细查看了是否有人已经做到了这一点,以便我可以阅读并学习如何做到这一点。但是我找不到任何东西。 (找到了一个接近的帖子,但没有解决方案)。
无论如何,我遵循了Simple Injector MVC实现(请参见下面的标准代码),并尝试了许多方法,我认为问题出在我调用RegisterMvcControllers上。
纠正我如果我错了,但是这个语句将选择所有名称后缀为“controller”的控制器。
问题:我该如何选择要在Simple Injector中注册的控制器? (这称为手动注册吗?)
非常感谢您提供任何帮助,因为我今天大部分时间都在努力理解所有这些内容,并继续下一步,即已实施DI并实例化我的对象。
        // 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()));
    }
1个回答

8
“RegisterMvcControllers” 对要注册的类型有以下限制:
  • 该类型必须是公共的
  • 该类型必须实现“ System.Web.Mvc.IController”
  • 该类型不能是抽象类
  • 该类型不能是泛型类型定义
  • 其名称必须以“Controller”结尾
您可以在源代码这里看到发生了什么。
“RegisterMvcControllers” 扩展方法调用了 “SimpleInjectorMvcExtensions.GetControllerTypesToRegister” 方法来获取要注册的控制器列表。您可以按以下方式自己调用该方法来查看注册了什么:
var registeredControllerTypes =
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())

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

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接