Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带Web API 2的Autofac-无参数构造函数错误_C#_Asp.net Web Api2_Autofac - Fatal编程技术网

C# 带Web API 2的Autofac-无参数构造函数错误

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

我正在尝试在我的Web API 2项目上设置Autofac。我以前只用过几次。我使用Nuget安装了AutofacAutofac.WebApi2。 然后在我的创业课程中,我做了以下几点:

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