Я изо всех сил пытаюсь заставить 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
Мой контроллер:
public class GatewayController : ApiController
{
private readonly IMyService_myService;
public GatewayController(IMyService myService)
{
Argument.IsNotNull(() => myService);
_myService = myService;
}
}
Кто-нибудь может увидеть, что я сделал неправильно, пожалуйста?