下面的代码是在应用程序global.asax
中初始化依赖注入容器IUnityContainer container = new UnityContainerFactory().CreateConfiguredContainer();
var serviceLocator = new UnityServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => serviceLocator);
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
但是应用程序总是失败,因为参数较少的构造函数异常 HomeController,下面是例外。
依赖项的解析失败,输入=" MyApp.Web.Controllers.HomeController",name ="(none)"。 在解决时发生例外情况。
在例外时,容器是:
解析MyApp.Web.Controllers.HomeController,(无) 解析参数" serviceLocator"构造函数MyApp.Web.Controllers.HomeController(Microsoft.Practices.ServiceLocation.IServiceLocator serviceLocator) 解析Microsoft.Practices.ServiceLocation.IServiceLocator,(无)
以下是例外的内部例外。
位于e:\ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ ObjectBuilder \ Strategies \ BuildPlan \ DynamicMethod \ Creation \ DynamicMethodConstructorStrategy.cs:中的Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context) 207 在BuildUp_Microsoft.Practices.ServiceLocation.IServiceLocator(IBuilderContext) 在Microsoft的.Practices.ObjectBuilder2.BuildPrateStrategy.PreBuildUp(IBuilderContext context)中的e:\ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ ObjectBuilder \ Strategies \ BuildPlan \ BuildPlanStrategy.cs:第43行 位于e:\ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ ObjectBuilder \ Strategies \ StrategyChain.cs中的Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context):第112行 atE:\ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ ObjectBuilder \ BuilderContext.cs中的Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey):第215行 在BuildUp_MyApp.Web.Controllers.HomeController(IBuilderContext) 在Microsoft的.Practices.ObjectBuilder2.BuildPrateStrategy.PreBuildUp(IBuilderContext context)中的e:\ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ ObjectBuilder \ Strategies \ BuildPlan \ BuildPlanStrategy.cs:第43行 位于e:\ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ ObjectBuilder \ Strategies \ StrategyChain.cs中的Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context):第112行 在Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型t,对象存在,字符串名称,IEnumerable`1 resolverOverrides)中的e:\ Builds \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ UnityContainer.cs:第511行< / p>
已使用Microsoft.Practices.Unity 2.0.414.0。实施有什么问题,我错过了什么?
答案 0 :(得分:3)
您需要注册控制器所依赖的所有接口。在这种情况下
HomeController(Microsoft.Practices.ServiceLocation.IServiceLocator serviceLocator) {...}
意味着你需要像
这样的行container.RegisterType<IServiceLocator, SomeServiceLocatorImpl>();
请注意,通常更好的做法是依赖于所需的界面,而不是IServiceLocator
- How to avoid Service Locator Anti-Pattern?
答案 1 :(得分:1)
您的构造函数可能具有以下签名
public class HomeController : Controller
{
public HomeController( IServiceLocator locator )
{
...
Unity遵循签名并尝试查找映射到接口的具体类型,并在容器中注册。但没有。
然而,你所做的是一个错误。您应该将实际依赖项注入服务/业务对象,而不是服务定位器的基础结构类。
public HomeController( ISomeService service, IAnotherService another )
Unity会解决这些问题,假设您首先将抽象映射到具体类型。