[英]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.
在解决时发生异常:
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.