天天看點

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

控制器本身是不帶有參的構造函數的,如果我們為控制器僅僅提供有參的構造函數,就會報錯。不過,可以利用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&lt;</code><code>object</code><code>&gt; 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&lt;IControllerFactory, UnityControllerFactory&gt;();</code>

<code>    </code><code>//_container.RegisterType&lt;ISubjectRepository, SubjectRepository&gt;(new TransientLifetimeManager());</code>

<code>    </code><code>DependencyResolver.SetResolver(</code><code>new</code> <code>UnityDependencyResolver(container));</code>

3:Web.config配置如下

<code>&lt;configSections&gt;</code>

<code>  </code><code>&lt;section name=</code><code>"unity"</code> <code>type=</code><code>"Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"</code><code>/&gt;</code>

<code>&lt;/configSections&gt;</code>

<code>  </code><code>&lt;assembly name=</code><code>"SampleProject"</code><code>/&gt;</code>

<code>  </code><code>&lt;</code><code>namespace</code> <code>name=</code><code>"SampleProject"</code><code>/&gt;</code>

<code>  </code><code>&lt;alias alias=</code><code>"ISampleClass"</code> <code>type=</code><code>"ISampleClass"</code> <code>/&gt;</code>

<code>  </code><code>&lt;alias alias=</code><code>"SampleClass"</code> <code>type=</code><code>"SampleClass"</code> <code>/&gt;</code>

<code>  </code><code>&lt;container name=</code><code>"containerOne"</code><code>&gt;</code>

<code>    </code><code>&lt;register type=</code><code>"ISampleClass"</code> <code>mapTo=</code><code>"SampleClass"</code> <code>/&gt;</code>

<code>  </code><code>&lt;/container&gt;</code>

<code>&lt;/unity&gt;</code>

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

本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/archive/2011/12/22/2298262.html,如需轉載請自行聯系原作者

繼續閱讀