• MVC TIP8:为控制器增加有参构造函数(为了注入等其它用途)


    控制器本身是不带有参的构造函数的,如果我们为控制器仅仅提供有参的构造函数,就会报错。不过,可以利用DependencyResolver的SetResolver方法,让ASP.NET MVC支持有参的构造函数。

    1:为系统准备两个类型,如下:

    image

    注意,这里要实现的是让控制器支持Unity注入。

    UnityControllerFactory代码如下:

        public class UnityControllerFactory : DefaultControllerFactory
        {
            IUnityContainer container;
            public UnityControllerFactory(IUnityContainer container)
            {
                this.container = container;
            }
    
            protected override IController GetControllerInstance(RequestContext reqContext,
                Type controllerType)
            {
                if (controllerType == null)
                {
                    return null;
                }
                return container.Resolve(controllerType) as IController;
            }
        }

    UnityDependencyResolver代码如下:

        public class UnityDependencyResolver : IDependencyResolver
        {
            IUnityContainer container;
    
            public UnityDependencyResolver(IUnityContainer container)
            {
                this.container = container;
            }
    
            public object GetService(Type serviceType)
            {
                if (!this.container.IsRegistered(serviceType))
                {
                    return null;
                }
                return container.Resolve(serviceType);
            }
    
            public IEnumerable<object> GetServices(Type serviceType)
            {
                return container.ResolveAll(serviceType);
            }
        }

    2:在Application_Start中注册

    代码如下:

                using (IUnityContainer container = new UnityContainer())
                {
                    UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
                    section.Configure(container, "containerOne");
                    //tell mvc use UnityDependencyResolver to create controll instances;
                    container.RegisterType<IControllerFactory, UnityControllerFactory>();
                    //_container.RegisterType<ISubjectRepository, SubjectRepository>(new TransientLifetimeManager());
                    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
                }

    3:Web.config配置如下

      <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
      </configSections>
    
      <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
        <assembly name="SampleProject"/>
        <namespace name="SampleProject"/>
    
        <alias alias="ISampleClass" type="ISampleClass" />
        <alias alias="SampleClass" type="SampleClass" />
    
        <container name="containerOne">
          <register type="ISampleClass" mapTo="SampleClass" />
        </container>
    
      </unity>

    至此,完成本文所述功能。

  • 相关阅读:
    luogu_P1850 换教室
    luogu_P3224 [HNOI2012]永无乡
    luogu_P1064 金明的预算方案
    luogu_P2014 选课
    luogu_P3372 【模板】线段树 1(动态开点)
    luogu_P2852 [USACO06DEC]牛奶模式Milk Patterns
    luogu_P1941 飞扬的小鸟
    luogu_P2678 跳石头
    luogu_P1638 逛画展
    【Tyvj2046】掷骰子
  • 原文地址:https://www.cnblogs.com/luminji/p/2298262.html
Copyright © 2020-2023  润新知