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,以下是例外。
解析依赖失败,类型="MyApp.Web.Controllers.HomeController",名称=“(none)”。
异常发生在:解析时。
异常是:InvalidOperationException - 当前类型 Microsoft.Practices.ServiceLocation.IServiceLocator 是一个接口,无法构造。您是否缺少类型映射?
发生异常时,容器是:
正在解析MyApp.Web.Controllers.HomeController,(none)
解析构造函数MyApp.Web.Controllers.HomeController(Microsoft.Practices.ServiceLocation.IServiceLocator serviceLocator)的参数"serviceLocator"
解析 Microsoft.Practices.ServiceLocation.IServiceLocator,(none)
下面是异常的内部异常
在 Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext 上下文)在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\DynamicMethod\Creation\DynamicMethodConstructorStrategy.cs:line 207
在 BuildUp_Microsoft.Practices.ServiceLocation.IServiceLocator(IBuilderContext)
在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\BuildPlanStrategy.cs:line 43
在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs:line 112
在 Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\BuilderContext.cs:line 215
在 BuildUp_MyApp.Web.Controllers.HomeController(IBuilderContext)
在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\BuildPlanStrategy.cs:line 43
在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs:line 112
在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainer.cs:line 511
Microsoft.Practices.Unity 2.0.414.0 已使用。实施有什么问题,我错过了什么吗?
您需要注册您的控制器所依赖的所有接口。在这种情况下
HomeController(Microsoft.Practices.ServiceLocation.IServiceLocator serviceLocator) {...}
意味着你需要像
这样的行
container.RegisterType<IServiceLocator, SomeServiceLocatorImpl>();
请注意,通常更好的做法是依赖所需的接口而不是 IServiceLocator
- How to avoid Service Locator Anti-Pattern?
您的构造函数可能具有以下签名
public class HomeController : Controller
{
public HomeController( IServiceLocator locator )
{
...
Unity 遵循签名并尝试找到映射到接口的具体类型,并在您的容器中注册。但是有none.
然而,你所做的是一个错误。您应该将实际依赖项注入服务/业务对象,而不是基础设施 class 服务定位器。
public HomeController( ISomeService service, IAnotherService another )
假设您首先将抽象映射到具体类型,Unity 会解决这些问题。
下面的代码是在应用程序中初始化依赖注入容器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",名称=“(none)”。 异常发生在:解析时。
异常是:InvalidOperationException - 当前类型 Microsoft.Practices.ServiceLocation.IServiceLocator 是一个接口,无法构造。您是否缺少类型映射?
发生异常时,容器是:
正在解析MyApp.Web.Controllers.HomeController,(none) 解析构造函数MyApp.Web.Controllers.HomeController(Microsoft.Practices.ServiceLocation.IServiceLocator serviceLocator)的参数"serviceLocator" 解析 Microsoft.Practices.ServiceLocation.IServiceLocator,(none)
下面是异常的内部异常
在 Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext 上下文)在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\DynamicMethod\Creation\DynamicMethodConstructorStrategy.cs:line 207 在 BuildUp_Microsoft.Practices.ServiceLocation.IServiceLocator(IBuilderContext) 在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\BuildPlanStrategy.cs:line 43 在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs:line 112 在 Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\BuilderContext.cs:line 215 在 BuildUp_MyApp.Web.Controllers.HomeController(IBuilderContext) 在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\BuildPlanStrategy.cs:line 43 在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs:line 112 在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) 在 e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainer.cs:line 511
Microsoft.Practices.Unity 2.0.414.0 已使用。实施有什么问题,我错过了什么吗?
您需要注册您的控制器所依赖的所有接口。在这种情况下
HomeController(Microsoft.Practices.ServiceLocation.IServiceLocator serviceLocator) {...}
意味着你需要像
这样的行container.RegisterType<IServiceLocator, SomeServiceLocatorImpl>();
请注意,通常更好的做法是依赖所需的接口而不是 IServiceLocator
- How to avoid Service Locator Anti-Pattern?
您的构造函数可能具有以下签名
public class HomeController : Controller
{
public HomeController( IServiceLocator locator )
{
...
Unity 遵循签名并尝试找到映射到接口的具体类型,并在您的容器中注册。但是有none.
然而,你所做的是一个错误。您应该将实际依赖项注入服务/业务对象,而不是基础设施 class 服务定位器。
public HomeController( ISomeService service, IAnotherService another )
假设您首先将抽象映射到具体类型,Unity 会解决这些问题。