Использование Autofac: регистрация компонентов, запуск приложения и разбор сервисов
Регистрация компонентов
Для получения помощи по использованию Autofac можно обратиться к китайской документации Autofac (https://autofaccn.readthedocs.io/zh/latest/index.html).
Регистрация компонентов может быть выполнена в любом месте с использованием интерфейса IDependencyRegistrar.
Атрибут Order определяет порядок регистрации.
Метод Register предоставляет ContainerBuilder для регистрации компонентов и ITypeFinder для динамической загрузки программ и поиска типов в сборках, что может использоваться для динамической загрузки плагинов.
Реализаций IDependencyRegistrar может быть несколько, и они могут быть размещены в любом месте проекта.
Пример кода на C#:
// Surf.Data.dll
public class DependencyRegistrar : IDependencyRegistrar
{
public int Order => 1;
public void Register(ContainerBuilder builder, ITypeFinder typeFinder)
{
// Регистрация универсальных типов
builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IRepository<>)).InstancePerLifetimeScope();
}
}
// Surf.Service.dll
public class DependencyRegistrar2 : IDependencyRegistrar
{
public int Order => 2; // или 1
public void Register(ContainerBuilder builder, ITypeFinder typeFinder)
{
builder.RegisterType<Service>().As<IService>().InstancePerLifetimeScope();
}
}
Дополнительные сведения о регистрации компонентов можно найти в китайской документации Autofac — «Компоненты регистрации» (https://autofaccn.readthedocs.io/zh/latest/register/parameters.html) и английской документации Autofac — Registration Concepts (https://autofac.readthedocs.io/en/latest/register/registration.html).
О жизненном цикле
Дополнительная информация о жизненном цикле при регистрации компонентов доступна в статье «Жизненный цикл или область действия экземпляра» (https://autofaccn.readthedocs.io/zh/latest/lifetime/instance-scope.html).
Запуск приложения
При запуске приложения вызывается EngineContext.Initialie() для инициализации регистрации, после чего сервисы могут быть разрешены в любом месте.
В методе Main для запуска консольных приложений и служб используется следующий код:
static void Main(string[] args)
{
EngineContext.Initialize();
}
Для запуска приложений .NET Framework необходимо вызвать EngineContext.Initialize() в методе Application_Start() класса Global.cs:
protected void Application_Start()
{
// Инициализация
EngineContext.Initialize();
// Для Web Mvc требуется установить ссылку PM> Install-Package Autofac.Mvc5
System.Web.Mvc.DependencyResolver.SetResolver(new AutofacDependencyResolver(EngineContext.Scope));
// Для Web Api требуется установить ссылку PM> Install-Package Autofac.WebApi2
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(EngineContext.Scope);
}
Для запуска .NET Core приложений необходимо вызвать EngineContext.Initialize(services) в методе ConfigureServices класса Startup.cs. Также необходимо изменить тип возвращаемого значения метода ConfigureServices с Void на IServiceProvider:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Необходимо вернуть значение для API
return EngineContext.Initialize(services, ScopeTag.Http);
//или вернуть EngineContext.Initialize(services); //для Web / Api
}
Дополнительную информацию о запуске приложений можно найти в статье «Application Startup» (https://autofaccn.readthedocs.io/zh/latest/getting-started/index.html#id3) и «Application Startup» на английском языке (https://autofac.readthedocs.io/en/latest/getting-started/index.html#application-startup).
Разрешение сервисов
Сервисы могут быть получены с помощью метода EngineContext.Resolve в любом месте приложения. Если необходимо использовать BeginLifetimeScope(), то это можно сделать следующим образом:
using(var scope = EngineContext.BeginLifetimeScope())
{
var service = scope.Resolve<IService>();
var service2 = scope.Resolve<IService2>();
}
Более подробную информацию о разрешении сервисов можно найти в статье «Разрешение сервисов» (https://autofaccn.readthedocs.io/zh/latest/resolve/index.html). builder.RegisterType().As().InstancePerLifetimeScope();
匹配后缀注册 typeEndName
// 注册 Services.dll 下所有 以Service结尾的服务。
// 如:AppRoleService、WorksheetService、
builder.RegisterAssemblyTypes(typeFinder, "Services.dll", typeEndName: "Service").AsImplementedInterfaces().InstancePerLifetimeScope();
泛型注册 RegisterGeneric
builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IRepository<>)).InstancePerLifetimeScope(); // or SingleInstance()
单例服务的注册 SingleInstance
builder.RegisterType<CacheService>().As<ICacheService>().SingleInstance();
Пример кода можно посмотреть: Samples.
NuGet: Autofac.Engine
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )