Код: Выделить всё
public interface IFoo
{
public void RegisterSomething();
public void Start();
}
Мы хотим зарегистрировать 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();
}
Код: Выделить всё
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 Далее мы создаем экземпляры двух других сервисов, которые зависят от ifooo . Когда эти сервисы получают доступ к экземпляру ifoo , будет ли передавать делегат в качестве параметра для регистрации INITIALICE () будет вызоваться более одного раза? Однако, когда я проверил это в отдельном проекте, это было вызвано только один раз.
Подробнее здесь: https://stackoverflow.com/questions/794 ... ration-mec