无法使Autofac与Web API 2一起使用

时间:2019-01-31 07:40:16

标签: c# asp.net-web-api asp.net-web-api2 autofac

我正在努力让Autofac与WebApi2控制器一起使用

我总是会得到一个错误,即没有无参数的构造函数

{
    "Message": "An error has occurred.",
    "ExceptionMessage": "An error occurred when trying to create a controller of type 'GatewayController'. 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__15.MoveNext()",
    "InnerException": {
        "Message": "An error has occurred.",
        "ExceptionMessage": "Type 'Gv8ApiGateway.Controllers.GatewayController' does not have a default constructor".....
    }
}

我在网上浏览了很多帖子,我看不到我错过了任何事情

构建容器后查看容器时,可以看到它确实包含控制器

我正在使用TopShelf

    HostFactory.Run(x => //1
    {
        x.UseAutofacContainer(container);

        x.Service<IMyService>(s => //2
        {
            s.ConstructUsingAutofacContainer();
            s.WhenStarted(tc => tc.Start());
            s.WhenStopped(tc => tc.Stop());
        });
        x.SetStartTimeout(TimeSpan.FromMinutes(4));
        x.StartAutomatically();
        x.RunAsLocalSystem();
        x.EnableServiceRecovery(r => { r.RestartService(0); });
        x.SetDescription($"DESCRIPTION");
        x.SetDisplayName($"DISPLAY NAME");
        x.SetServiceName($"NAME");
    });

在我的组装模块中,我已验证的行称为

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

在由TopShelf开始的课程中,我有-

var resolver = new AutofacWebApiDependencyResolver(_container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
_webApi = WebApp.Start<Startup>("http://localhost:8084");

我的启动课程是-

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Configure Web API for self-host. 
        var config = new HttpConfiguration();

        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional}
        );

        app.UseWebApi(config);


    }
}

我认为关键是我设置了依赖关系解析器的地方,但是在我称之为API的地方(即在启动API之前或之后)似乎没有什么区别

我的控制器是:

public class GatewayController : ApiController
{
    private readonly IMyService_myService;

    public GatewayController(IMyService myService)
    {
        Argument.IsNotNull(() => myService);

        _myService = myService;
    }


}

任何人都可以看到我做错了吗?

2 个答案:

答案 0 :(得分:0)

您必须在如下所示的容器中注册服务和界面。

container.Register<IMyService, MyService>();

在TopSelf配置设置之前,添加上面的代码。它将起作用。

答案 1 :(得分:0)

您的Web API启动类显示您正在使用OWIN管道。我们看到这是因为您是从头开始创建HttpConfiguration

app.UseWebApi(config);

If you check out the documentation on Web API OWIN integration,您将看到一个有关其变化的示例。 关键是您必须设置config.DependencyResolver,而不是GlobalConfiguration.DependencyResolver

如文档中所述:

  

OWIN集成中的一个常见错误是使用GlobalConfiguration.Configuration在OWIN中,您可以从头开始创建配置。在使用OWIN集成时,您不应在任何地方引用GlobalConfiguration.Configuration

请注意,还有一些额外的步骤来确保OWIN管道可以与Autofac一起正常使用。 There are docs on setting up the base OWIN pipeline和另外的Autofac Web API specific middleware that needs to be added

我在Web API启动中看不到任何Autofac中间件,因此这也可能导致问题。建议您回头看看其中一些文档。