【问题标题】:Autofac MVC5 and WebAPI2.1 not workingAutofac MVC5 和 WebAPI2.1 不工作
【发布时间】:2014-03-04 12:56:16
【问题描述】:

这是我在 global.asax 中的Bootstrap

public class Global : HttpApplication {
        void Application_Start(object sender, EventArgs e) {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            // initiate dependency injection resolver
            DependencyInjectionResolver.RegisterDependencies(typeof(Global).Assembly);
        }
    }

这里是实现

public class DependencyInjectionResolver {
    private static IContainer _container;

    public static TService Resolve<TService>() {
        return DependencyResolver.Current.GetService<TService>();
    }

    public static void RegisterDependencies(Assembly assembly) {
        var builder = new ContainerBuilder();
        builder.RegisterFilterProvider();
        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

        builder.RegisterGeneric(typeof (Repository<>))
            .As(typeof (IRepository<>))
            .InstancePerHttpRequest()
            .InstancePerLifetimeScope();

        builder.RegisterType<LoggerService>()
            .As<ILoggerService>()
            .InstancePerApiRequest()
            .InstancePerHttpRequest();

        builder.Register(x =>
            new MessageDataService(Resolve<ILoggerService>(), Resolve<IRepository<ApiRequestHistory>>()))
            .As<IMessagesDataService>()
            .InstancePerHttpRequest()
            .InstancePerApiRequest();

        #region setup

        _container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(_container));
        GlobalConfiguration.Configuration.DependencyResolver 
            = new AutofacWebApiDependencyResolver(_container);
        #endregion
    }
}

这是我的例外:

    An error has occurred.An error occurred when trying to create a controller of type 'MessageReportController'. Make sure that the controller has a parameterless public constructor.System.InvalidOperationException   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
   at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
   at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()An error has occurred.Type 'WayToLead.Web.UI.api.MessageReportController' does not have a default constructorSystem.ArgumentException   at System.Linq.Expressions.Expression.New(Type type)
   at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)
   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

如何修复它以使用 WebApi 和 Mvc 控制器?

【问题讨论】:

  • 我在 ApiControllers 上遇到了同样的问题,但是 MVC 控制器正在被解决并构造得很好。您是否也只有 WebApi2 控制器有问题?
  • 我也是。我还没有解决这个问题。
  • 我设法解决了。在一两个内部异常的深处,我注意到真正发生的事情是我有一个未注册的依赖项,这是 api 控制器的依赖项所必需的。在我注册后,它开始运行得很好。
  • @enriquein 将其添加到答案中,我很乐意将其设置为答案。

标签: autofac asp.net-web-api2 asp.net-mvc-5.1


【解决方案1】:

检查您是否已注册所有 ApiControllers 的依赖项和子依赖项。在堆栈跟踪的深处,您可能会发现 AutoFac 无法解决的确切依赖项。

我猜测,由于 AutoFac 无法满足所有依赖项,因此默认的依赖项解析器会接管。

【讨论】:

  • 我会检查并回复你。谢谢。
猜你喜欢
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2023-03-04
  • 2017-01-12
相关资源
最近更新 更多