Unity+MVC:实现IDependencyResolver接口需要注意的地方
2011-06-09 17:52
591 查看
ASP.NET MVC3提供了IDependencyResolver接口,实现该接口,并结合相应的“依赖注入容器”(比如:Unity)可以方便地对Controller进行依赖注入。
本文以Unity为例,说明一下实现IDependencyResolver接口需要注意的地方。
先看一下我们使用的实现代码:
这样实现后,访问时出现下面的错误:
![](http://pic002.cnblogs.com/images/2011/1/2011060917240214.png)
从这个错误可以分析出,ASP.NET MVC试图通过Unity解析IControllerFactory的实现,但我们在代码中并没有注册IControllerFactory的实现。
于是,我们手动注册一下,代码如下:
之前的错误消失了,却出现了新的错误:
又找不到另外一个接口(IControllerActivator)的实现,难道要手工一个一个注册?
看来这不是解决之道,需要另辟捷径...
在codeplex中发现了Unity.MVC3(也是通过Unity实现ASP.NET MVC Contorller的依赖注入),学习了一下它的代码,发现了解决之道。
原来只需在IDependencyResolver.GetService(Type serviceType)的实现中,判断一下serviceType是否被注册,如果没有被注册,就返回null。ASP.NET MVC得到null返回值,会自己解析这个接口,这样问题就解决了,代码如下:
本文以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
![](http://pic002.cnblogs.com/images/2011/1/2011060917240214.png)
从这个错误可以分析出,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); }
相关文章推荐
- unity 中将c#打包成dll中,需要注意的地方
- 通俗易懂地讲解Android app国际化实现方式,开发需要注意的地方
- 使用C++实现JNI接口需要注意的事项
- 设计抽象类或接口时需要注意的地方
- UILabel实现自适应宽高需要注意的地方
- 实现自定义page基类时需要注意的地方
- UILabel实现自适应宽高需要注意的地方(三)
- FPGA中状态机实现需要注意的地方
- FPGA中状态机实现需要注意的地方
- 为DataGrid写一个Renderer需要注意实现的两个接口:IListDataRenderer和IDropInListDataRenderer
- WSDL接口数据传递以及外网发布需要注意的地方
- JAXB实现XML和java对象互转以及soapXml和对象互转需要注意的地方
- unity 中将c#打包成dll中,需要注意的地方
- 创建一个Spring+SpringMVC+MyBatis+MySql+Maven项目需要注意的地方
- MVC中使用过滤器做权限认证需要注意的地方
- 抽象类与接口需要注意的地方
- 小数运算需要注意什么? 接口和抽象类 WinForm窗体上两个panel,怎么实现一个panel固定漂浮在另一个panel之上
- Unity协程(Coroutine)使用时需要注意的地方,协程异常中断,异常停止执行的一种可能性
- 使用C++实现JNI接口需要注意的事项
- v4.0上用MSBuild折腾MVC 2.0的项目需要注意的地方