|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。ASP.NETMVC3供应了IDependencyResolver接口,完成该接口,并分离响应的“依附注进容器”(好比:Unity)能够便利地对Controller举行依附注进。
本文以Unity为例,申明一下完成IDependencyResolver接口必要注重的中央。
先看一下我们利用的完成代码:- namespaceCNBlogs.Infrastructure.CrossCutting.IoC{publicclassIoCDependencyResolver:IDependencyResolver{#regionMemebersprivateIContainer_currentContainter;#endregion#regionConstructorspublicIoCDependencyResolver(IContainercontainer){_currentContainter=container;}#endregion#regionIDependencyResolverMemberspublicobjectGetService(TypeserviceType){return_currentContainter.Resolve(serviceType);}publicIEnumerable<object>GetServices(TypeserviceType){return_currentContainter.ResolveAll(serviceType);}#endregion}}
复制代码 如许完成后,会见时呈现上面的毛病:- Thecurrenttype,System.Web.Mvc.IControllerFactory,isaninterfaceandcannotbeconstructed.Areyoumissingatypemapping
复制代码
<br>
从这个毛病能够剖析出,ASP.NETMVC试图经由过程Unity剖析IControllerFactory的完成,但我们在代码中并没有注册IControllerFactory的完成。
因而,我们手动注册一下,代码以下:- _currentContainer.RegisterType<IControllerFactory,DefaultControllerFactory>();
复制代码 之前的毛病消散了,却呈现了新的毛病:- Thecurrenttype,System.Web.Mvc.IControllerActivator,isaninterfaceandcannotbeconstructed.Areyoumissingatypemapping?
复制代码 又找不到别的一个接口(IControllerActivator)的完成,岂非要手工一个一个注册?
看来这不是办理之道,必要另辟捷径...
在codeplex中发明了Unity.MVC3(也是经由过程Unity完成ASP.NETMVCContorller的依附注进),进修了一下它的代码,发明懂得决之道。
本来只需在IDependencyResolver.GetService(TypeserviceType)的完成中,判别一下serviceType是不是被注册,假如没有被注册,就前往null。ASP.NETMVC失掉null前往值,会本人剖析这个接口,如许成绩就办理了,代码以下:
- publicobjectGetService(TypeserviceType){if(!_currentContainter.IsRegistered(serviceType)){returnnull;}return_currentContainter.Resolve(serviceType);}
复制代码 来自:http://www.ckuyun.com/dudu/archive/2011/06/09/unity_mvc_idependencyresolver.html
简单的说:.net只有微软一家在做的,微软也不允许别人跟他做相同的工具,所以他就把需要的工具全部封装在.net的平台上了;而net网页编程是公开了。 |
|