天天看點

MVC TIP8:為控制器增加有參構造函數(為了注入等其它用途)

控制器本身是不帶有參的構造函數的,如果我們為控制器僅僅提供有參的構造函數,就會報錯。不過,可以利用DependencyResolver的SetResolver方法,讓ASP.NET MVC支援有參的構造函數。

1:為系統準備兩個類型,如下:

MVC TIP8:為控制器增加有參構造函數(為了注入等其它用途)

注意,這裡要實作的是讓控制器支援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>      

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

MVC TIP8:為控制器增加有參構造函數(為了注入等其它用途)

本文基于

Creative Commons Attribution 2.5 China Mainland License

釋出,歡迎轉載,演繹或用于商業目的,但是必須保留本文的署名

http://www.cnblogs.com/luminji

(包含連結)。如您有任何疑問或者授權方面的協商,請給我留言。

繼續閱讀