繁体   English   中英

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

[英]Unity : No parameterless constructor defined for this object.

下面的代码是在应用程序global.asax中初始化依赖注入容器

IUnityContainer container = new UnityContainerFactory().CreateConfiguredContainer();
var serviceLocator = new UnityServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => serviceLocator);
DependencyResolver.SetResolver(new UnityDependencyResolver(container));

但是,对于HomeController,应用程序总是失败,参数较少的构造函数异常,下面是异常。

依赖项的解析失败,type =“MyApp.Web.Controllers.HomeController”,name =“(none)”。 在解决时发生异常:

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

在例外时,容器是:

解析MyApp.Web.Controllers.HomeController,(无)解析构造函数MyApp.Web.Controllers.HomeController的参数“serviceLocator”(Microsoft.Practices.ServiceLocation.IServiceLocator serviceLocator)解析Microsoft.Practices.ServiceLocation.IServiceLocator,(none)

以下是异常的内部异常。

在BuildUp_Microsoft的e:\\ Builds \\ Unity \\ UnityTemp \\ Compile \\ Unity \\ Unity \\ Src \\ ObjectBuilder \\ Strategies \\ BuildPlan \\ DynamicMethod \\ Creation \\ DynamicMethodConstructorStrategy.cs:中的Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context)中位于e:\\ Builds \\ Unity \\ UnityTemp \\ Compile \\ Unity \\ Unity \\ Src \\ ObjectBuilder \\ Strategies \\ BuildPlan \\ BuildPlanStrategy.cs中的Microsoft.Practices.ObjectBuilder2.BuildPrategy.PreBuildUp(IBuilderContext context)中的.Practices.ServiceLocation.IServiceLocator(IBuilderContext) :位于Microsoft.Practices的e:\\ Builds \\ Unity \\ UnityTemp \\ Compile \\ Unity \\ Unity \\ Src \\ ObjectBuilder \\ Strategies \\ StrategyChain.cs:第112行中的Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)中的第43行。 ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)位于BuildUp_MyApp.Web.Controllers.H的e:\\ Builds \\ Unity \\ UnityTemp \\ Compile \\ Unity \\ Unity \\ Src \\ ObjectBuilder \\ BuilderContext.cs:第215行 位于e:\\ Builds \\ Unity \\ UnityTemp \\ Compile \\ Unity \\ Unity \\ Src \\ ObjectBuilder \\ Strategies \\ BuildPlan \\ BuildPlanStrategy.cs:Microsoft的第43行的Microsoft.Practices.ObjectBuilder2.BuildPrateStrategy.PreBuildUp(IBuilderContext context)中的omeController(IBuilderContext) .Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)位于e:\\ Builds \\ Unity \\ UnityTemp \\ Compile \\ Unity \\ Unity \\ Src \\ ObjectBuilder \\ Strategies \\ StrategyChain.cs:第112行,位于Microsoft.Practices.Unity.UnityContainer.DoBuildUp (在e:\\ Builds \\ Unity \\ UnityTemp \\ Compile \\ Unity \\ Unity \\ Src \\ UnityContainer.cs中输入t,Object existing,String name,IEnumerable`1 resolverOverrides):第511行

已使用Microsoft.Practices.Unity 2.0.414.0。 实施有什么问题,我错过了什么?

您需要注册控制器所依赖的所有接口。 在这种情况下

HomeController(Microsoft.Practices.ServiceLocation.IServiceLocator serviceLocator) {...}

意味着你需要像线一样

container.RegisterType<IServiceLocator, SomeServiceLocatorImpl>();

请注意,通常更好的做法是依赖于所需的接口而不是IServiceLocator - 如何避免服务定位器反模式?

您的构造函数可能具有以下签名

public class HomeController : Controller
{
  public HomeController( IServiceLocator locator )
  {
      ...

Unity遵循签名并尝试查找映射到接口的具体类型,并在容器中注册。 但没有。

然而,你所做的是一个错误。 您应该将实际依赖项注入服务/业务对象,而不是服务定位器所属的基础结构类。

 public HomeController( ISomeService service, IAnotherService another )

假设您首先将抽象映射到具体类型,Unity将解决这些问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM