Как зарегистрировать и разрешить компонент в сухом МОК, который имеет механик самостоятельной регистрации?C#

Место общения программистов C#
Anonymous
Как зарегистрировать и разрешить компонент в сухом МОК, который имеет механик самостоятельной регистрации?

Сообщение Anonymous »

Существует служба ifoo из внешней библиотеки, которая имеет свои собственные механизмы для регистрации своих компонентов. Мне нужно зарегистрировать службу в контейнере Dry IOC, а также его дополнительные компоненты внутри него, а затем вызовать метод START () службы, который запустит службу для выполнения задач, которые он предназначен для обработки.

Код: Выделить всё

public interface IFoo
{
public void RegisterSomething();

public void Start();
}
Пакет Nuget содержит метод addfooservices () , который регистрирует эту службу и все необходимые службы для работы в библиотеке в IserviceCollection .
Мы хотим зарегистрировать ifoo в нашем регистрации Modulea , который будет назван in. Для того, как мы регистрируем все услуги в контейнере сухого МОК в нашем проекте. Однако, чтобы получить экземпляр этой службы, нам нужен экземпляр iServiceCollection , который еще не был создан на данный момент, поскольку метод Configureservices из класса запуска еще не был вызван.

Код: Выделить всё

public static class Program
{
private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseDryIoc(
ModuleA.Register,
ModuleB.Register)
.ConfigureWebHostDefaults(web =>
{
web.UseStartup()
.UseIIS();
});

public static void Main(string[] args)
=> CreateHostBuilder(args)
.Build()
.Run();
}
Вопрос: как мы можем получить экземпляр службы ifoo от iServiceCollection во время регистрации в сухом IOC? Мы зарегистрируем делегат с использованием RegisterInitializer ((Service, Resolver) => ...) , который будет вызван при первом запросе на службу.

Код: Выделить всё

public static class ModuleA
{
public static IServiceCollection AddServices(this IServiceCollection services)
{
services.AddFooServices();

return services;
}

public static void Register(IContainer container)
{
container.Register(Reuse.Singleton);

container.RegisterInitializer((service, resolver) =>
resolver.Resolve());
}

internal class Bar
{
public IFoo Service { get; init; } = null!;

public Bar()
{
Service.RegisterSomething();

Service.Start();
}
}
}
< /code>
Тем не менее, это приводит к накладным платам при запуске приложения, поскольку первый запрос на службу будет медленным. В этот момент мы также должны зарегистрировать сервис, запустить ее и дождаться начала, но мы бы предпочли сделать это заранее, на этапе регистрации. Предположим, у нас есть сервис ifoo 
, которая вводится как зависимость в планку класса . Как служба, так и класс зарегистрированы в сухом контейнере IOC в качестве синглетонов. В этом случае, используя RegisterInitializer ((Service, Resolver) => ...) , мы зарегистрируем конструктор Bar () в качестве делегата, который будет вызван при доступе к ifoo .
Далее мы создаем экземпляры двух других сервисов, которые зависят от ifooo . Когда эти сервисы получают доступ к экземпляру ifoo , будет ли передавать делегат в качестве параметра для регистрации INITIALICE () будет вызоваться более одного раза? Однако, когда я проверил это в отдельном проекте, это было вызвано только один раз.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ration-mec

Вернуться в «C#»