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);
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
2005-06-09 遭遇UIInfo.exe
2004-06-09 [公告]博客园建立了“提问区”