![](/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.