C# 带Web API 2的Autofac-无参数构造函数错误
我正在尝试在我的Web API 2项目上设置Autofac。我以前只用过几次。我使用Nuget安装了Autofac和Autofac.WebApi2。 然后在我的创业课程中,我做了以下几点:C# 带Web API 2的Autofac-无参数构造函数错误,c#,asp.net-web-api2,autofac,C#,Asp.net Web Api2,Autofac,我正在尝试在我的Web API 2项目上设置Autofac。我以前只用过几次。我使用Nuget安装了Autofac和Autofac.WebApi2。 然后在我的创业课程中,我做了以下几点: public partial class Startup { public void Configuration(IAppBuilder app) { // Get our http configuration var config = new HttpCon
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
// Get our http configuration
var config = new HttpConfiguration();
// Register the Autofac middleware FIRST. This also adds
// Autofac-injected middleware registered with the container.
var container = ConfigureInversionOfControl(app, config);
// Register all areas
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
// Use our web api
app.UseWebApi(config);
}
/// <summary>
/// Configures Autofac DI/IoC
/// </summary>
/// <param name="app"></param>
/// <param name="config"></param>
private IContainer ConfigureInversionOfControl(IAppBuilder app, HttpConfiguration config)
{
// Create our container
var builder = new ContainerBuilder();
// You can register controllers all at once using assembly scanning...
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// Register our module
builder.RegisterModule(new AutofacModule());
// Build
var container = builder.Build();
// Lets Web API know it should locate services using the AutofacWebApiDependencyResolver
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
// Return our container
return container;
}
}
公共部分类启动
{
公共无效配置(IAppBuilder应用程序)
{
//获取我们的http配置
var config=新的HttpConfiguration();
//首先注册Autofac中间件。这也会添加
//已向容器注册Autofac注入中间件。
var容器=配置反转控制(应用程序,配置);
//登记所有区域
RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
//使用我们的web api
app.UseWebApi(配置);
}
///
///配置Autofac DI/IoC
///
///
///
专用IContainer配置反转控制(IAppBuilder应用程序、HttpConfiguration配置)
{
//创建我们的容器
var builder=new ContainerBuilder();
//您可以使用程序集扫描一次性注册所有控制器。。。
RegisterAppController(Assembly.getExecutionGassembly());
//注册我们的模块
RegisterModule(新的AutofacModule());
//建造
var container=builder.Build();
//让Web API知道它应该使用AutoFacWebAPI依赖解析程序定位服务
config.DependencyResolver=新的AutoFacWebApidencyResolver(容器);
//归还我们的集装箱
返回容器;
}
}
我创建的模块如下所示:
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// Create our Singletons
builder.RegisterType<DatabaseContext>().As<DbContext>().InstancePerRequest();
// Create our Services
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterType<AnswerService>().As<IAnswerService>().InstancePerRequest();
builder.RegisterType<CategoryService>().As<ICategoryService>().InstancePerRequest();
builder.RegisterType<FeedService>().As<IFeedService>().InstancePerRequest();
builder.RegisterType<FilterService>().As<IFilterService>().InstancePerRequest();
builder.RegisterType<QuestionGroupService>().As<IQuestionGroupService>().InstancePerRequest();
builder.RegisterType<StateService>().As<IStateService>().InstancePerRequest();
// Create our providers
//builder.RegisterType<AnswerProvider>().As<IAnswerProvider>().InstancePerLifetimeScope();
builder.RegisterType<CategoryProvider>().As<ICategoryProvider>().InstancePerRequest();
builder.RegisterType<FeedProvider>().As<IFeedProvider>().InstancePerRequest();
builder.RegisterType<FilterProvider>().As<IFilterProvider>().InstancePerRequest();
builder.RegisterType<QuestionGroupProvider>().As<IQuestionGroupProvider>().InstancePerRequest();
builder.RegisterType<StateProvider>().As<IStateProvider>().InstancePerRequest();
}
}
// Readonly properties
private readonly ICategoryProvider _provider;
/// <summary>
/// Default constructor
/// </summary>
public CategoriesController(ICategoryProvider provider)
{
_provider = provider;
}
/// <summary>
/// Default constructor
/// </summary>
public CategoryProvider(IUnitOfWork unitOfWork, ICategoryService service)
{
// Map our properties
_unitOfWork = unitOfWork;
_service = service;
}
/// <summary>
/// The default constructor
/// </summary>
/// <param name="unitOfWork"></param>
public CategoryService(IUnitOfWork unitOfWork)
: base(unitOfWork)
{
}
/// <summary>
/// Default constructor
/// </summary>
/// <param name="context">The database context</param>
public UnitOfWork(DbContext context)
{
_context = context;
_repositories = new Dictionary<Type, object>();
}
公共类自动传真模块:模块
{
受保护的覆盖无效负载(ContainerBuilder builder)
{
//创造我们的单身
builder.RegisterType().As().InstancePerRequest();
//创建我们的服务
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
//创建我们的提供商
//builder.RegisterType();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
builder.RegisterType().As().InstancePerRequest();
}
}
我添加了一个提供者作为API构造函数的参数,如下所示:
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// Create our Singletons
builder.RegisterType<DatabaseContext>().As<DbContext>().InstancePerRequest();
// Create our Services
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterType<AnswerService>().As<IAnswerService>().InstancePerRequest();
builder.RegisterType<CategoryService>().As<ICategoryService>().InstancePerRequest();
builder.RegisterType<FeedService>().As<IFeedService>().InstancePerRequest();
builder.RegisterType<FilterService>().As<IFilterService>().InstancePerRequest();
builder.RegisterType<QuestionGroupService>().As<IQuestionGroupService>().InstancePerRequest();
builder.RegisterType<StateService>().As<IStateService>().InstancePerRequest();
// Create our providers
//builder.RegisterType<AnswerProvider>().As<IAnswerProvider>().InstancePerLifetimeScope();
builder.RegisterType<CategoryProvider>().As<ICategoryProvider>().InstancePerRequest();
builder.RegisterType<FeedProvider>().As<IFeedProvider>().InstancePerRequest();
builder.RegisterType<FilterProvider>().As<IFilterProvider>().InstancePerRequest();
builder.RegisterType<QuestionGroupProvider>().As<IQuestionGroupProvider>().InstancePerRequest();
builder.RegisterType<StateProvider>().As<IStateProvider>().InstancePerRequest();
}
}
// Readonly properties
private readonly ICategoryProvider _provider;
/// <summary>
/// Default constructor
/// </summary>
public CategoriesController(ICategoryProvider provider)
{
_provider = provider;
}
/// <summary>
/// Default constructor
/// </summary>
public CategoryProvider(IUnitOfWork unitOfWork, ICategoryService service)
{
// Map our properties
_unitOfWork = unitOfWork;
_service = service;
}
/// <summary>
/// The default constructor
/// </summary>
/// <param name="unitOfWork"></param>
public CategoryService(IUnitOfWork unitOfWork)
: base(unitOfWork)
{
}
/// <summary>
/// Default constructor
/// </summary>
/// <param name="context">The database context</param>
public UnitOfWork(DbContext context)
{
_context = context;
_repositories = new Dictionary<Type, object>();
}
//只读属性
专用readonly IcadegoryProvider _provider;
///
///默认构造函数
///
公共分类控制器(ICategoryProvider)
{
_提供者=提供者;
}
但是,当我尝试调用API(使用postman)时,会出现以下错误:
{
"message": "An error has occurred.",
"exceptionMessage": "An error occurred when trying to create a controller of type 'CategoriesController'. Make sure that the controller has a parameterless public constructor.",
"exceptionType": "System.InvalidOperationException",
"stackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"innerException": {
"message": "An error has occurred.",
"exceptionMessage": "Type 'Piiick.Api.Controllers.CategoriesController' does not have a default constructor",
"exceptionType": "System.ArgumentException",
"stackTrace": " at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
}
}
{
“消息”:“发生错误。”,
“exceptionMessage”:“尝试创建“CategoriesController”类型的控制器时出错。请确保该控制器具有无参数公共构造函数。”,
“异常类型”:“System.InvalidOperationException”,
“stackTrace”:“at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage请求)\r\n位于System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext()“,
“内部异常”:{
“消息”:“发生错误。”,
“exceptionMessage”:“类型'Piiick.Api.Controllers.CategoriesController'没有默认构造函数”,
“exceptionType”:“System.ArgumentException”,
“stackTrace”:“at System.Linq.Expressions.Expression.New(Type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage请求,Type controllerType,Func`1&activator)\r\n位于System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,Type controllerType)
}
}
我现在陷入困境,根本看不出问题在哪里。
类别提供程序的构造函数如下所示:
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// Create our Singletons
builder.RegisterType<DatabaseContext>().As<DbContext>().InstancePerRequest();
// Create our Services
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterType<AnswerService>().As<IAnswerService>().InstancePerRequest();
builder.RegisterType<CategoryService>().As<ICategoryService>().InstancePerRequest();
builder.RegisterType<FeedService>().As<IFeedService>().InstancePerRequest();
builder.RegisterType<FilterService>().As<IFilterService>().InstancePerRequest();
builder.RegisterType<QuestionGroupService>().As<IQuestionGroupService>().InstancePerRequest();
builder.RegisterType<StateService>().As<IStateService>().InstancePerRequest();
// Create our providers
//builder.RegisterType<AnswerProvider>().As<IAnswerProvider>().InstancePerLifetimeScope();
builder.RegisterType<CategoryProvider>().As<ICategoryProvider>().InstancePerRequest();
builder.RegisterType<FeedProvider>().As<IFeedProvider>().InstancePerRequest();
builder.RegisterType<FilterProvider>().As<IFilterProvider>().InstancePerRequest();
builder.RegisterType<QuestionGroupProvider>().As<IQuestionGroupProvider>().InstancePerRequest();
builder.RegisterType<StateProvider>().As<IStateProvider>().InstancePerRequest();
}
}
// Readonly properties
private readonly ICategoryProvider _provider;
/// <summary>
/// Default constructor
/// </summary>
public CategoriesController(ICategoryProvider provider)
{
_provider = provider;
}
/// <summary>
/// Default constructor
/// </summary>
public CategoryProvider(IUnitOfWork unitOfWork, ICategoryService service)
{
// Map our properties
_unitOfWork = unitOfWork;
_service = service;
}
/// <summary>
/// The default constructor
/// </summary>
/// <param name="unitOfWork"></param>
public CategoryService(IUnitOfWork unitOfWork)
: base(unitOfWork)
{
}
/// <summary>
/// Default constructor
/// </summary>
/// <param name="context">The database context</param>
public UnitOfWork(DbContext context)
{
_context = context;
_repositories = new Dictionary<Type, object>();
}
//
///默认构造函数
///
公共类别提供者(IUnitOfWork、ICategoryService和IUnitOfWork)
{
//映射我们的属性
_unitOfWork=unitOfWork;
_服务=服务;
}
类别服务的构造函数如下所示:
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// Create our Singletons
builder.RegisterType<DatabaseContext>().As<DbContext>().InstancePerRequest();
// Create our Services
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterType<AnswerService>().As<IAnswerService>().InstancePerRequest();
builder.RegisterType<CategoryService>().As<ICategoryService>().InstancePerRequest();
builder.RegisterType<FeedService>().As<IFeedService>().InstancePerRequest();
builder.RegisterType<FilterService>().As<IFilterService>().InstancePerRequest();
builder.RegisterType<QuestionGroupService>().As<IQuestionGroupService>().InstancePerRequest();
builder.RegisterType<StateService>().As<IStateService>().InstancePerRequest();
// Create our providers
//builder.RegisterType<AnswerProvider>().As<IAnswerProvider>().InstancePerLifetimeScope();
builder.RegisterType<CategoryProvider>().As<ICategoryProvider>().InstancePerRequest();
builder.RegisterType<FeedProvider>().As<IFeedProvider>().InstancePerRequest();
builder.RegisterType<FilterProvider>().As<IFilterProvider>().InstancePerRequest();
builder.RegisterType<QuestionGroupProvider>().As<IQuestionGroupProvider>().InstancePerRequest();
builder.RegisterType<StateProvider>().As<IStateProvider>().InstancePerRequest();
}
}
// Readonly properties
private readonly ICategoryProvider _provider;
/// <summary>
/// Default constructor
/// </summary>
public CategoriesController(ICategoryProvider provider)
{
_provider = provider;
}
/// <summary>
/// Default constructor
/// </summary>
public CategoryProvider(IUnitOfWork unitOfWork, ICategoryService service)
{
// Map our properties
_unitOfWork = unitOfWork;
_service = service;
}
/// <summary>
/// The default constructor
/// </summary>
/// <param name="unitOfWork"></param>
public CategoryService(IUnitOfWork unitOfWork)
: base(unitOfWork)
{
}
/// <summary>
/// Default constructor
/// </summary>
/// <param name="context">The database context</param>
public UnitOfWork(DbContext context)
{
_context = context;
_repositories = new Dictionary<Type, object>();
}
//
///默认构造函数
///
///
公共类别服务(IUnitOfWork unitOfWork)
:基础(工作单元)
{
}
最后,UnitOfWork具有如下构造函数:
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// Create our Singletons
builder.RegisterType<DatabaseContext>().As<DbContext>().InstancePerRequest();
// Create our Services
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterType<AnswerService>().As<IAnswerService>().InstancePerRequest();
builder.RegisterType<CategoryService>().As<ICategoryService>().InstancePerRequest();
builder.RegisterType<FeedService>().As<IFeedService>().InstancePerRequest();
builder.RegisterType<FilterService>().As<IFilterService>().InstancePerRequest();
builder.RegisterType<QuestionGroupService>().As<IQuestionGroupService>().InstancePerRequest();
builder.RegisterType<StateService>().As<IStateService>().InstancePerRequest();
// Create our providers
//builder.RegisterType<AnswerProvider>().As<IAnswerProvider>().InstancePerLifetimeScope();
builder.RegisterType<CategoryProvider>().As<ICategoryProvider>().InstancePerRequest();
builder.RegisterType<FeedProvider>().As<IFeedProvider>().InstancePerRequest();
builder.RegisterType<FilterProvider>().As<IFilterProvider>().InstancePerRequest();
builder.RegisterType<QuestionGroupProvider>().As<IQuestionGroupProvider>().InstancePerRequest();
builder.RegisterType<StateProvider>().As<IStateProvider>().InstancePerRequest();
}
}
// Readonly properties
private readonly ICategoryProvider _provider;
/// <summary>
/// Default constructor
/// </summary>
public CategoriesController(ICategoryProvider provider)
{
_provider = provider;
}
/// <summary>
/// Default constructor
/// </summary>
public CategoryProvider(IUnitOfWork unitOfWork, ICategoryService service)
{
// Map our properties
_unitOfWork = unitOfWork;
_service = service;
}
/// <summary>
/// The default constructor
/// </summary>
/// <param name="unitOfWork"></param>
public CategoryService(IUnitOfWork unitOfWork)
: base(unitOfWork)
{
}
/// <summary>
/// Default constructor
/// </summary>
/// <param name="context">The database context</param>
public UnitOfWork(DbContext context)
{
_context = context;
_repositories = new Dictionary<Type, object>();
}
//
///默认构造函数
///
///数据库上下文
公共UnitOfWork(DbContext上下文)
{
_上下文=上下文;
_存储库=新字典();
}
据我所知,一切都设置正确。
有人能发现我忘记做的事情吗?在构建容器之前,尝试注册已加载到应用程序域的执行上下文中的程序集:
var assemblies=AppDomain.CurrentDomain.GetAssemblies();builder.RegisterAssemblyModule(程序集)代码>
我发现了这个问题,我正在使用HttpConfiguration
设置依赖项解析器,它应该是GlobalConfiguration.Configuration
所以当我把我的台词从:
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
到
一切都开始工作。您使用OWIN吗?另外,请出示您的cod