global.asax.cs中的简单测试注册:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//This allows interfaces etc to be provided as parameters to action methods
ModelBinders.Binders.DefaultBinder = new DiModelBinder();
//Now call the method to initialise anything that is required before startup (which includes setting up DI)
WebUiInitialise.InitialiseThis(this);
var builder = new Autofac.ContainerBuilder();
builder.RegisterApiControllers(System.Reflection.Assembly.GetExecutingAssembly());
builder.RegisterModule(new ServiceLayer.Startup.ServiceLayerModule());
var container = builder.Build();
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
}
测试apicontroller:
public class TestController : ApiController
{
public TestController(IListService service)
{
}
[HttpGet]
public IQueryable<AspNetUser> Users(IListService service)
{
return null;
//return service.GetAll<AspNetUser>();
}
}
调试到TestController构造函数时,IListService服务有一个值,但在调试Users HttpGet方法时,它是null。
有没有办法解决Web Api控制器的依赖关系(IListService服务),get方法和post方法,而不仅仅是构造函数?
对于MVC控制器,方法解决,而不仅仅是构造函数。
答案 0 :(得分:1)
如果您希望Autofac向Web API控制器注入某些内容,则它必须是构造函数参数或公共可设置属性。
即使在MVC中,默认情况下,Autofac也不会填充控制器操作参数。如果您还将特殊的Autofac动作调用者注册到管道中,它还有一定的能力,但同样,这不是默认行为的一部分 - 它是选择加入的。
Web API集成中不存在该动作调用程序支持。对于Web API,您需要使用标准的IoC实践。