Unity+MVC:实现IDependencyResolver接口需要注意的地方
ASP.NET MVC3提供了IDependencyResolver接口,實現該接口,并結合相應的“依賴注入容器”(比如:Unity)可以方便地對Controller進行依賴注入。
本文以Unity為例,說明一下實現IDependencyResolver接口需要注意的地方。
先看一下我們使用的實現代碼:
namespace CNBlogs.Infrastructure.CrossCutting.IoC{
public class IoCDependencyResolver : IDependencyResolver
{
#region Memebers
private IContainer _currentContainter;
#endregion
#region Constructors
public IoCDependencyResolver(IContainer container)
{
_currentContainter = container;
}
#endregion
#region IDependencyResolver Members
public object GetService(Type serviceType)
{
return _currentContainter.Resolve(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _currentContainter.ResolveAll(serviceType);
}
#endregion
}
}
這樣實現后,訪問時出現下面的錯誤:
The current type, System.Web.Mvc.IControllerFactory, is an interface and cannot be constructed.Are you missing a type mapping
從這個錯誤可以分析出,ASP.NET MVC試圖通過Unity解析IControllerFactory的實現,但我們在代碼中并沒有注冊IControllerFactory的實現。
于是,我們手動注冊一下,代碼如下:
_currentContainer.RegisterType<IControllerFactory, DefaultControllerFactory>();之前的錯誤消失了,卻出現了新的錯誤:
The current type, System.Web.Mvc.IControllerActivator, is an interface and cannot be constructed.Are you missing a type mapping?
又找不到另外一個接口(IControllerActivator)的實現,難道要手工一個一個注冊?
看來這不是解決之道,需要另辟捷徑...
在codeplex中發現了Unity.MVC3(也是通過Unity實現ASP.NET MVC Contorller的依賴注入),學習了一下它的代碼,發現了解決之道。
原來只需在IDependencyResolver.GetService(Type serviceType)的實現中,判斷一下serviceType是否被注冊,如果沒有被注冊,就返回null。ASP.NET MVC得到null返回值,會自己解析這個接口,這樣問題就解決了,代碼如下:
public object GetService(Type serviceType)
{
if (!_currentContainter.IsRegistered(serviceType))
{
return null;
}
return _currentContainter.Resolve(serviceType);
}
轉載于:https://www.cnblogs.com/dudu/archive/2011/06/09/unity_mvc_idependencyresolver.html
總結
以上是生活随笔為你收集整理的Unity+MVC:实现IDependencyResolver接口需要注意的地方的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何:向 Windows 窗体组件附加智
- 下一篇: 建筑工程项目管理信息化PM