2014-03-06 64 views
0

在我的ASP.NET Web MVC控制器(v5.1)中,我想切換到使用Postal(v0.9.1)上的IEMailService,所以我確實在控制器上執行了以下操作:郵政和Unity的依賴注入異常

public class HomeController : Controller 
{ 
    private readonly IEmailService _emailService; 

    public HomeController(IEmailService emailService) 
    { 
    if (emailService == null) 
     throw new ArgumentNullException("emailService"); 
    _emailService = emailService; 
    } 
} 

我的統一(V3.0)容器設置:

container.RegisterType<IEmailService, EmailService>(); 
container.RegisterType<IEmailViewRenderer, EmailViewRenderer>(); 
container.RegisterType<IEmailParser, EmailParser>(); 

但我得到這個例外,我可以沒有任何意義了的。
實際上,Unity試圖告訴我什麼?

The type IList`1 does not have an accessible constructor. 

堆棧跟蹤:

[InvalidOperationException: The type IList`1 does not have an accessible constructor.] 
    Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForNullExistingObject(IBuilderContext context) +239 
    lambda_method(Closure , IBuilderContext) +60 
    Microsoft.Practices.ObjectBuilder2.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context) +71 
    Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context) +42 
    Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) +333 
    Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274 
    Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) +250 
    Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context) +101 
    lambda_method(Closure , IBuilderContext) +205 
    Microsoft.Practices.ObjectBuilder2.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context) +71 
    Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context) +42 
    Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) +333 
    Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274 
    Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) +250 
    Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context) +101 
    lambda_method(Closure , IBuilderContext) +205 
    Microsoft.Practices.ObjectBuilder2.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context) +71 
    Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context) +42 
    Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) +333 
    Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274 
    Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) +250 
    Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context) +101 
    lambda_method(Closure , IBuilderContext) +231 
    Microsoft.Practices.ObjectBuilder2.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context) +71 
    Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context) +42 
    Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) +333 
    Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274 
    Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) +250 
    Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context) +101 
    lambda_method(Closure , IBuilderContext) +209 
    Microsoft.Practices.ObjectBuilder2.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context) +71 
    Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context) +42 
    Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) +333 
    Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) +274 
    Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) +383 

[ResolutionFailedException: Resolution of the dependency failed, type = "PostalTest.Controllers.HomeController", name = "(none)". 
Exception occurred while: while resolving. 
Exception is: InvalidOperationException - The type IList`1 does not have an accessible constructor. 
----------------------------------------------- 
At the time of the exception, the container was: 

    Resolving PostalTest.Controllers.HomeController,(none) 
    Resolving parameter "emailService" of constructor PostalTest.Controllers.HomeController(Postal.IEmailService emailService) 
    Resolving Postal.EmailService,(none) (mapped from Postal.IEmailService, (none)) 
    Resolving parameter "emailViewRenderer" of constructor Postal.EmailService(Postal.IEmailViewRenderer emailViewRenderer, Postal.IEmailParser emailParser, System.Func`1[[System.Net.Mail.SmtpClient, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] createSmtpClient) 
     Resolving Postal.EmailViewRenderer,(none) (mapped from Postal.IEmailViewRenderer, (none)) 
     Resolving parameter "viewEngines" of constructor Postal.EmailViewRenderer(System.Web.Mvc.ViewEngineCollection viewEngines) 
     Resolving System.Web.Mvc.ViewEngineCollection,(none) 
     Resolving parameter "list" of constructor System.Web.Mvc.ViewEngineCollection(System.Collections.Generic.IList`1[[System.Web.Mvc.IViewEngine, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] list) 
      Resolving System.Collections.Generic.IList`1[System.Web.Mvc.IViewEngine],(none) 
] 
    Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) +446 
    Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name, IEnumerable`1 resolverOverrides) +50 
    Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides) +48 
    Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer container, Type t, ResolverOverride[] overrides) +61 
    Unity.Mvc5.UnityDependencyResolver.GetService(Type serviceType) +140 
    System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +87 

[InvalidOperationException: An error occurred when trying to create a controller of type 'PostalTest.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.] 
    System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +247 
    System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +438 
    System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +226 
    System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +326 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +157 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +88 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +50 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

回答

2

我不使用統一的,但可能你只是註冊的電子郵件服務的實例呢?

container.RegisterInstance<IEmailService>(new EmailService()); 
+0

謝謝,這工作得更好 –