是否可以将Autofac配置为使用ASP .NET MVC和ASP .NET Web Api。我知道依赖解析器是不同的。但是当使用记录的方法时,我只能设置一个全局解析器。
// Set the dependency resolver implementation.
GlobalConfiguration.Configuration.DependencyResolver = resolver;
这种方法难道不好吗?我应该将我的解决方案分成两个项目并为每个项目处理依赖注入吗?
答案 0 :(得分:92)
当然可以将Autofac配置为使用MVC和Web API。预计这将是一种非常常见的情况。有两个单独的依赖项解析器实现,因为MVC和Web API可以彼此独立使用。这同样适用于Autofac集成。
在同一个应用程序中同时使用MVC和Web API时,每个都需要自己的依赖项解析器,尽管它们可以提供相同的容器实例。
var builder = new ContainerBuilder();
// Add your registrations
var container = builder.Build();
// Set the dependency resolver for Web API.
var webApiResolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;
// Set the dependency resolver for MVC.
var mvcResolver = new AutofacDependencyResolver(container);
DependencyResolver.SetResolver(mvcResolver);
也可以在两者之间共享注册,因为InstancePerApiRequest
和InstancePerHttpRequest
生命周期范围现在共享相同的标记。
请注意,为Web API和MVC设置依赖项解析程序的机制是不同的。 Web API使用GlobalConfiguration.Configuration.DependencyResolver
,MVC使用DependencyResolver.SetResolver
。
答案 1 :(得分:14)
我想我会在mvc5和web api 2中为那些苦苦挣扎的人添加一些帮助。
首先添加nuget包
在全局添加application_start(或作为app_start类)添加对以下类的调用
AutofacConfig.RegisterAutoFac();
现在在App_start
下添加此类using System.Reflection;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi;
namespace Example1.Web
{
public class AutofacConfig
{
public static IContainer RegisterAutoFac()
{
var builder = new ContainerBuilder();
AddMvcRegistrations(builder);
AddRegisterations(builder);
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
return container;
}
private static void AddMvcRegistrations(ContainerBuilder builder)
{
//mvc
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterModelBinderProvider();
//web api
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired();
builder.RegisterModule<AutofacWebTypesModule>();
}
private static void AddRegisterations(ContainerBuilder builder)
{
//builder.RegisterModule(new MyCustomerWebAutoFacModule());
}
}
}
从现在开始,为添加到项目的每个新程序集添加一个新模块,然后在AddRegisterations函数中注册该模块(给出示例)
注意强>:
我退回了容器,这不是必需的。
这会扫描当前程序集中的模块,因此不要在AddRegisterations中添加本地模块,否则您将两次注册。
答案 2 :(得分:4)
绝对将它们分开。 Autofac具有ASP.NET MVC和ASP.NET Web API集成。情况并非总是如此,但如果您在两个应用程序中都需要相同的服务,那么应用程序架构很可能出现问题。
以下是使用ASP.NET Web API执行此操作的方法:
internal class AutofacWebAPI {
public static void Initialize(HttpConfiguration config) {
config.DependencyResolver = new AutofacWebApiDependencyResolver(
RegisterServices(new ContainerBuilder())
);
}
private static IContainer RegisterServices(ContainerBuilder builder) {
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired();
//deal with your dependencies here
builder.RegisterType<CarsService>().As<ICarsService>();
builder.RegisterType<CarsCountService>().As<ICarsCountService>();
return builder.Build();
}
}
然后,在Global.asax.cs中注册,如下所示:
AutofacWebAPI.Initialize(GlobalConfiguration.Configuration);