【问题标题】:Autofac Web API error Make sure that the controller has a parameterless public constructorAutofac Web API 错误确保控制器有一个无参数的公共构造函数
【发布时间】:2018-07-27 00:16:45
【问题描述】:

我在使用 ASP.NET WebAPI 配置 Autofac 时遇到此错误。

An error occurred when trying to create a controller of type 'UserController'. Make sure that the controller has a parameterless public constructor.

Startup.cs

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var file = HostingEnvironment.MapPath("~/log4net.config");
        if (file != null)
        {
            var configFile = new FileInfo(file);
            if (configFile.Exists)
                XmlConfigurator.ConfigureAndWatch(configFile);
            else
                BasicConfigurator.Configure();
        }
        else
        {
            BasicConfigurator.Configure();
        }

        var builder = new ContainerBuilder();

        var config = new HttpConfiguration();

        // Register your Web API controllers.
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

        builder.RegisterWebApiFilterProvider(config);
        builder.RegisterModule(new WebModule(app));

        // Register your MVC controllers.
        builder.RegisterControllers(Assembly.GetExecutingAssembly());

        // OPTIONAL: Register model binders that require DI.
        builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
        builder.RegisterModelBinderProvider();

        // OPTIONAL: Register web abstractions like HttpContextBase.
        builder.RegisterModule<AutofacWebTypesModule>();

        // OPTIONAL: Enable property injection in view pages.
        builder.RegisterSource(new ViewRegistrationSource());

        // OPTIONAL: Enable property injection into action filters.
        builder.RegisterFilterProvider();

        // register config
        builder.Register(ct => config).AsSelf().SingleInstance();
        HelpPageConfig.Register(config);

        var container = builder.Build();
        config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        app.UseAutofacMiddleware(container);
        app.UseAutofacWebApi(config);
        app.UseAutofacMvc();
        WebApiConfig.Register(config);

        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);
        config.EnsureInitialized();
    }
}

Global.asax.cs

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

WebModule.cs

public class WebModule : Module
{
    private readonly IAppBuilder _app;

    public WebModule(IAppBuilder app)
    {
        _app = app;
    }

    protected override void Load(ContainerBuilder builder)
    {
        // ----  Utilities -----------------------------------
        builder.RegisterType<Log4NetLogger>()
            .As<ILogger>().SingleInstance();
        builder.RegisterType<DataAccessConfigurationSettings>()
            .As<IDataAccessSettings>().SingleInstance();
        builder.RegisterType<ApplicationServicesConfigurationSettings>()
            .As<IApplicationServicesSettings>().SingleInstance();
        builder.RegisterType<ValidationExceptionHandler>()
            .As<IExceptionHandler<ValidationException>>().SingleInstance();
        builder.RegisterType<SqlExceptionHandler>()
            .As<IExceptionHandler<SqlException>>().SingleInstance();
        builder.RegisterType<GeneralExceptionHandler>()
            .As<IExceptionHandler<Exception>>().SingleInstance();


        // ----  Business ------------------------------------
        builder.RegisterType<UserBusiness>()
            .As<IUserBusiness>().InstancePerRequest();

        // ----  Validator -----------------------------------
        builder.RegisterType<UserSignupModelValidator>()
            .AsSelf().SingleInstance();

        // ----  Controllers -----------------------------------
        builder.RegisterType<DeflateCompressionActionFilter>()
            .AsWebApiActionFilterFor<UserController>().InstancePerRequest();



        base.Load(builder);
    }
}

用户控制器.cs

[RoutePrefix("api/User")]
public class UserController : ApiController
{
    private readonly IUserBusiness _userBusiness;

    public UserController(IUserBusiness userBusiness)
    {
        _userBusiness = userBusiness;
    }
    ...
}

我相信我遗漏了一些我不知道的小东西,任何帮助将不胜感激。

【问题讨论】:

  • 你能显示你的 UserController 类的构造函数吗
  • @floscheiwiller 我已经更新了我的问题
  • 您在哪里将 UserBusiness 类注册为 IUserBusiness ?类似于:builder.RegisterType().As();
  • 在WebModule.cs,我已经更新了问题
  • 将老式 WebAPI 与 OWIN 混合会导致问题... GlobalConfiguration 和 Startup 类不能混合使用。 autofac.readthedocs.io/en/latest/integration/…

标签: asp.net asp.net-web-api autofac ioc-container


【解决方案1】:

看看这个答案:MVC Web API not working with Autofac Integration

也许你只需要像上面链接中描述的那样设置你的容器:

var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = 
     new AutofacWebApiDependencyResolver(container);

理论上你会得到一个不同的例外,但也可能是这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2019-04-17
    相关资源
    最近更新 更多