我正在努力让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;
}
}
任何人都可以看到我做错了吗?
答案 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中间件,因此这也可能导致问题。建议您回头看看其中一些文档。