Можно ли настроить Autofac для работы с ASP.NET MVC и web ASP.NET API-интерфейс
можно ли настроить Autofac для работы с ASP .NET MVC и ASP .NET Web Api. Я знаю, что решатели зависимостей разные. Но при использовании документированных подходов я могу установить только один глобальный решатель.
// Set the dependency resolver implementation.
GlobalConfiguration.Configuration.DependencyResolver = resolver;
это плохая идея? Должен ли я разделить свое решение на два проекта и обрабатывать инъекцию зависимостей для каждого отдельно?
3 ответов:
конечно, можно настроить 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.
Я думал, что добавлю немного помощи тем, кто борется с этим в mvc5 и web api 2.
Сначала добавьте пакеты nuget
- Autofac
- Autofac asp.net интеграция mvc 5
- Autofac asp.net web api 2.X интеграция
в глобальном добавить в 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, иначе вы зарегистрируете все дважды.
определенно разделите их. 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(); } }затем зарегистрируйте это внутри глобального.асакс.CS, как показано ниже:
AutofacWebAPI.Initialize(GlobalConfiguration.Configuration);
Comments