我正在构建一个新的asp.net webapi应用程序,以后可能会使用asp.net MVC控制器。
我将使用Unity作为IOC + Lifetime解析器来处理我的对象。
我想要在一个地方解决所有类型。
我已经读过IDependencyResolver,它提供了一个服务定位器(我知道它是一个反模式),它似乎符合我的目标。
我试图找到"范围"这个IDependencyResolver并且不能 我所看到的是他在System.Web.Mvc下面 - 这让我想起了他的"范围"。
他什么时候开始"他在asp.net应用程序生命周期中的工作?
他也会解决HttpModules吗?或者他是否会开始"
我的Global.asax代码看起来像这样:
ApplicationUnityResolver resolver = new ApplicationUnityResolver(ApplicationContainer._container, DependencyResolver.Current);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
DependencyResolver.SetResolver(resolver);
我的ApplicationUnityResolver是:
System.Web.Mvc.IDependencyResolver
和System.Web.Http.Dependencies.IDependencyResolver
答案 0 :(得分:1)
我认为在DependencyResolver实例化的MVC管道中相当早。 MVC框架内部使用DependencyResolver。如您所知,在创建Controller期间,DependencyResolver会查找并创建控制器的实例。在IRouteHandler,即MvcRouteHandler被调用之后,这是正确的 - 在生命周期的早期阶段。
但是在HttpModules创建之后就好了,我认为使用DependencyResolver来注册HttpModules是不合时宜的。
我认为你无法自定义IDependencyResolver的范围。它只是Service Locator类型的容器,它可以帮助您插入自己的依赖项解析机制。
是IDependencyResolver是一种反模式,我个人不喜欢它。其实 Mark Seemann在IDependencyResolver上有really good article。我相信这会指向正确的方向。
最好使用Composition Root模式在一个位置注册依赖项。