控制器本身是不帶有參的構造函數的,如果我們為控制器僅僅提供有參的構造函數,就會報錯。不過,可以利用DependencyResolver的SetResolver方法,讓ASP.NET MVC支援有參的構造函數。
1:為系統準備兩個類型,如下:
<a href="http://images.cnblogs.com/cnblogs_com/luminji/201112/201112221803448555.png"></a>
注意,這裡要實作的是讓控制器支援Unity注入。
UnityControllerFactory代碼如下:
<code>public</code> <code>class</code> <code>UnityControllerFactory : DefaultControllerFactory</code>
<code>{</code>
<code> </code><code>IUnityContainer container;</code>
<code> </code><code>public</code> <code>UnityControllerFactory(IUnityContainer container)</code>
<code> </code><code>{</code>
<code> </code><code>this</code><code>.container = container;</code>
<code> </code><code>}</code>
<code> </code><code>protected</code> <code>override</code> <code>IController GetControllerInstance(RequestContext reqContext,</code>
<code> </code><code>Type controllerType)</code>
<code> </code><code>if</code> <code>(controllerType ==</code><code>null</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>return</code> <code>null</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>container.Resolve(controllerType)</code><code>as</code> <code>IController;</code>
<code>}</code>
UnityDependencyResolver代碼如下:
<code>public</code> <code>class</code> <code>UnityDependencyResolver : IDependencyResolver</code>
<code> </code><code>public</code> <code>UnityDependencyResolver(IUnityContainer container)</code>
<code> </code><code>public</code> <code>object</code> <code>GetService(Type serviceType)</code>
<code> </code><code>if</code> <code>(!</code><code>this</code><code>.container.IsRegistered(serviceType))</code>
<code> </code><code>return</code> <code>container.Resolve(serviceType);</code>
<code> </code><code>public</code> <code>IEnumerable<</code><code>object</code><code>> GetServices(Type serviceType)</code>
<code> </code><code>return</code> <code>container.ResolveAll(serviceType);</code>
2:在Application_Start中注冊
代碼如下:
<code>using</code> <code>(IUnityContainer container =</code><code>new</code> <code>UnityContainer())</code>
<code> </code><code>UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(</code><code>"unity"</code><code>);</code>
<code> </code><code>section.Configure(container,</code><code>"containerOne"</code><code>);</code>
<code> </code><code>//tell mvc use UnityDependencyResolver to create controll instances;</code>
<code> </code><code>container.RegisterType<IControllerFactory, UnityControllerFactory>();</code>
<code> </code><code>//_container.RegisterType<ISubjectRepository, SubjectRepository>(new TransientLifetimeManager());</code>
<code> </code><code>DependencyResolver.SetResolver(</code><code>new</code> <code>UnityDependencyResolver(container));</code>
3:Web.config配置如下
<code><configSections></code>
<code> </code><code><section name=</code><code>"unity"</code> <code>type=</code><code>"Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"</code><code>/></code>
<code></configSections></code>
<code> </code><code><assembly name=</code><code>"SampleProject"</code><code>/></code>
<code> </code><code><</code><code>namespace</code> <code>name=</code><code>"SampleProject"</code><code>/></code>
<code> </code><code><alias alias=</code><code>"ISampleClass"</code> <code>type=</code><code>"ISampleClass"</code> <code>/></code>
<code> </code><code><alias alias=</code><code>"SampleClass"</code> <code>type=</code><code>"SampleClass"</code> <code>/></code>
<code> </code><code><container name=</code><code>"containerOne"</code><code>></code>
<code> </code><code><register type=</code><code>"ISampleClass"</code> <code>mapTo=</code><code>"SampleClass"</code> <code>/></code>
<code> </code><code></container></code>
<code></unity></code>
至此,完成本文所述功能。
本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/archive/2011/12/22/2298262.html,如需轉載請自行聯系原作者