简体   繁体   English

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

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

Below code is to Initialize Dependency Injection Container in application global.asax 下面的代码是在应用程序global.asax中初始化依赖注入容器

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

But application is always failing with parameter less constructor exception for HomeController, below is the exception. 但是,对于HomeController,应用程序总是失败,参数较少的构造函数异常,下面是异常。

Resolution of the dependency failed, type = "MyApp.Web.Controllers.HomeController", name = "(none)". 依赖项的解析失败,type =“MyApp.Web.Controllers.HomeController”,name =“(none)”。 Exception occurred while: while resolving. 在解决时发生异常:

Exception is: InvalidOperationException - The current type, Microsoft.Practices.ServiceLocation.IServiceLocator, is an interface and cannot be constructed. 异常是:InvalidOperationException - 当前类型Microsoft.Practices.ServiceLocation.IServiceLocator是一个接口,无法构造。 Are you missing a type mapping? 你错过了类型映射吗?

At the time of the exception, the container was: 在例外时,容器是:

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

Below is the inner exception of the exception. 以下是异常的内部异常。

at Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context) in e:\\Builds\\Unity\\UnityTemp\\Compile\\Unity\\Unity\\Src\\ObjectBuilder\\Strategies\\BuildPlan\\DynamicMethod\\Creation\\DynamicMethodConstructorStrategy.cs:line 207 at BuildUp_Microsoft.Practices.ServiceLocation.IServiceLocator(IBuilderContext ) at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) in e:\\Builds\\Unity\\UnityTemp\\Compile\\Unity\\Unity\\Src\\ObjectBuilder\\Strategies\\BuildPlan\\BuildPlanStrategy.cs:line 43 at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) in e:\\Builds\\Unity\\UnityTemp\\Compile\\Unity\\Unity\\Src\\ObjectBuilder\\Strategies\\StrategyChain.cs:line 112 at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) in e:\\Builds\\Unity\\UnityTemp\\Compile\\Unity\\Unity\\Src\\ObjectBuilder\\BuilderContext.cs:line 215 at BuildUp_MyApp.Web.Controllers.H 在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行 omeController(IBuilderContext ) at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) in e:\\Builds\\Unity\\UnityTemp\\Compile\\Unity\\Unity\\Src\\ObjectBuilder\\Strategies\\BuildPlan\\BuildPlanStrategy.cs:line 43 at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) in e:\\Builds\\Unity\\UnityTemp\\Compile\\Unity\\Unity\\Src\\ObjectBuilder\\Strategies\\StrategyChain.cs:line 112 at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) in e:\\Builds\\Unity\\UnityTemp\\Compile\\Unity\\Unity\\Src\\UnityContainer.cs:line 511 位于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 has been used. 已使用Microsoft.Practices.Unity 2.0.414.0。 What is the issue with implementation, am I missing something? 实施有什么问题,我错过了什么?

You need to register all interfaces your controller relies on. 您需要注册控制器所依赖的所有接口。 In this case 在这种情况下

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

Means you need to have line like 意味着你需要像线一样

container.RegisterType<IServiceLocator, SomeServiceLocatorImpl>();

Note that it is generally better practice to depend on required interfaces instead on IServiceLocator - How to avoid Service Locator Anti-Pattern? 请注意,通常更好的做法是依赖于所需的接口而不是IServiceLocator - 如何避免服务定位器反模式?

Your constructor presumably has the following signature 您的构造函数可能具有以下签名

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

Unity follows the signature and tries to find a concrete type mapped to the interface, registered in your container. Unity遵循签名并尝试查找映射到接口的具体类型,并在容器中注册。 But there is none. 但没有。

What you do however, is a mistake. 然而,你所做的是一个错误。 You should be injecting actual dependencies to services / business objects, not to the infrastructure class a service locator is. 您应该将实际依赖项注入服务/业务对象,而不是服务定位器所属的基础结构类。

 public HomeController( ISomeService service, IAnotherService another )

Unity would resolve these, assuming you first map abstractions to concrete types. 假设您首先将抽象映射到具体类型,Unity将解决这些问题。

暂无
暂无

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

相关问题 没有为此对象定义无参数构造函数。 当我尝试使用 Unity 依赖时 - No parameterless constructor defined for this object. while i try for Unity Dependency 没有为此对象定义无参数构造函数。 MVC 5 - No parameterless constructor defined for this object. MVC 5 CBO.FillCollection抛出“没有为此对象定义的无参数构造函数。”错误 - CBO.FillCollection throwing “No parameterless constructor defined for this object.” error 获取“未为此对象定义无参数的构造函数。”发布视图模型时出错 - Getting “No parameterless constructor defined for this object.” Error while posting a viewmodel 错误“未为此对象定义无参数的构造函数。” ViewModel中的SelectList错误 - Error “No parameterless constructor defined for this object.” with SelectList from ViewModel System.MissingMethodException:没有为此对象定义的无参数构造函数。 MVC4 - System.MissingMethodException: No parameterless constructor defined for this object. MVC4 “没有为此对象定义无参数的构造函数。”对于使用结构映射的控制器中的IBus - “No parameterless constructor defined for this object.” for IBus in controller using StructureMap 没有为此对象定义无参数构造函数 - No parameterless constructor defined for this object Unity和ASP.NET WebForms - 没有为此对象定义的无参数构造函数 - Unity and ASP.NET WebForms - No parameterless constructor defined for this object ASP Net Core MVC创建实例控制器System.MissingMethodException:&#39;为此对象未定义无参数构造函数。 - asp net core mvc create instance controller System.MissingMethodException: 'No parameterless constructor defined for this object.'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM