簡體   English   中英

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,應用程序總是失敗,參數較少的構造函數異常,下面是異常。

依賴項的解析失敗,type =“MyApp.Web.Controllers.HomeController”,name =“(none)”。 在解決時發生異常:

異常是:InvalidOperationException - 當前類型Microsoft.Practices.ServiceLocation.IServiceLocator是一個接口,無法構造。 你錯過了類型映射嗎?

在例外時,容器是:

解析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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM