【发布时间】: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