我的 WebApi 项目中有以下类,并且从 Global.ASAX 类调用 RegisterContainer() 方法。我正在我的 api Controller 中注入(inject) Service。问题是它抛出异常并且没有得到实例化纠正。它说找不到无参数 Controller 。知道我的代码有什么问题
public class IocConfig
{
#region Public Methods and Operators
/// <summary>
/// Adds dependencies into the container
/// </summary>
/// <returns></returns>
public static void RegisterContainer()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
RegisterModules(builder);
RegisterControllers(builder);
}
#endregion
#region Methods
private static void RegisterControllers(ContainerBuilder builder)
{
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
}
private static void RegisterDependencyResolver(IContainer container, ContainerBuilder builder)
{
IDependencyResolver resolver = new AutofacWebApiDependencyResolver(container);
DependencyResolver.SetResolver(resolver);
}
private static void RegisterModules(ContainerBuilder builder)
{
builder.RegisterModule(new DomainModule());
builder.RegisterModule(new RepositoryModule());
builder.RegisterModule(new ServiceFacadeModule());
builder.RegisterModule(new MappingModule());
}
#endregion
}
}
更新:
我已经更改了这一点,并且仅向 Global.Asax 添加了以下几行。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//IocConfig.RegisterContainer();
//WebApiConfig.Register(GlobalConfiguration.Configuration);
var builder = new Autofac.ContainerBuilder();
builder.RegisterControllers(typeof(WebApiApplication).Assembly).PropertiesAutowired();
builder.RegisterModule(new RepositoryModule());
builder.RegisterModule(new ServiceFacadeModule());
builder.RegisterModule(new RepositoryModule());
builder.RegisterModule(new MappingModule());
builder.RegisterModule(new DomainModule());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
最佳答案
您正在尝试在容器构建后注册模块。
您需要转移调用
RegisterModules(builder);
在使用 builder.Build()
创建容器之前:
RegisterModules(builder);
IContainer container = builder.Build();
在更新后的代码中,您现在缺少两件事:
- 使用
RegisterApiControllers
注册您的 Api Controller - 设置
AutofacWebApiDependencyResolver
所以你的代码应该是这样的:
var builder = new Autofac.ContainerBuilder();
builder.RegisterControllers(typeof(WebApiApplication).Assembly).PropertiesAutowired();
builder.RegisterApiControllers(typeof(WebApiApplication).Assembly).PropertiesAutowired();
builder.RegisterModule(new RepositoryModule());
builder.RegisterModule(new ServiceFacadeModule());
builder.RegisterModule(new RepositoryModule());
builder.RegisterModule(new MappingModule());
builder.RegisterModule(new DomainModule());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
关于asp.net-web-api - AutoFac 与 Web Api,仍在寻找无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29941112/