Unity:没有为此对象定义无参数构造函数。

时间:2016-01-19 18:59:43

标签: c# asp.net-mvc dependency-injection unity-container

下面的代码是在应用程序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)"。 在解决时发生例外情况。

异常是:InvalidOperationException - 当前类型Microsoft.Practices.ServiceLocation.IServiceLocator是一个接口,无法构造。你错过了类型映射吗?

在例外时,容器是:

解析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。实施有什么问题,我错过了什么?

2 个答案:

答案 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会解决这些问题,假设您首先将抽象映射到具体类型。