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

注意,這裡要實作的是讓控制器支援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>
至此,完成本文所述功能。
本文基于
Creative Commons Attribution 2.5 China Mainland License釋出,歡迎轉載,演繹或用于商業目的,但是必須保留本文的署名
http://www.cnblogs.com/luminji(包含連結)。如您有任何疑問或者授權方面的協商,請給我留言。