![](/img/trans.png)
[英]No parameterless constructor defined for this object. while i try for Unity Dependency
[英]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)”。 在解决时发生异常:
在例外时,容器是:
解析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.