Соединение двух разных ContainerBuilder - PullRequest
0 голосов
/ 27 апреля 2020

Я перехожу с ASP. Net Framework на ASP. Net Core (3.1) приложение. Я новичок в этом. Depency Inyection управляется Autofa c в моем старом проекте. Поэтому мне нужно повторить поведение.

Мне нужно ConfigureContainer в моем классе Startup. Примерно так:

public class Startup
{

    public void ConfigureContainer(ContainerBuilder builder)
    {
        // Register your own things directly with Autofac, like:

        builder.RegisterType<MyFoo>().As<IMyFoo>();
    }
}

С другой стороны, у меня есть некоторые зависимости от класса Bootstrapper. Bootstrapper это класс из другого проекта. Этот класс вызывается другим проектом, поэтому я не могу его удалить. Это своего рода BaseContainer с некоторыми сервисами, которые они используют в других проектах.

public sealed class  BootStraper
{
    public ContainerBuilder Builder { get; set; }

    public BootStraper()
    {

        Builder = new ContainerBuilder();            
        Builder.RegisterType(typeof(Foo1));
        Builder.RegisterType(typeof(Foo2));
        Builder.RegisterType(typeof(Foo3));
        Builder.RegisterType(typeof(Foo4));
        Builder.RegisterType(typeof(Foo5));        
   }

   public void RegisterTypeSingleton(Type type)
   {
        Builder.RegisterType(type).SingleInstance();
   }
}

Я хотел бы объединить оба ContainerBuilder в одном. Как я могу это сделать?

Я видел Update() способ сделать это, но кажется, что он устарел

Любая идея?

1 Ответ

1 голос
/ 28 апреля 2020

Официальный сайт от Autofa c: asp - net -core-3-0-and-generi c -hosting описывает, как интегрировать с NetCore и Autofa c. Я также следовал этому руководству, чтобы выполнить sh такое же требование, как ваше.

Просто нужно немного изменить класс BootStraper , чтобы он стал производным классом Autofa c .Module . Таким образом, вы можете получить выгоду, просто добавив очень мало чистых кодов в Startup.cs, например:

Startup.cs

public void ConfigureContainer(Autofac.ContainerBuilder builder)
{
    // Register your custom BootStraper types here
    // If the ordering matters, just swtich this to the first or last line
    builder.RegisterModule<BootStraper>();   

    // Register your own things directly with Autofac, like:
    builder.RegisterType<MyFoo>().As<IMyFoo>();
}

BootStraper.cs

public sealed class  BootStraper : Autofac.Module
{
    // public ContainerBuilder Builder { get; set; }
    protected override void Load(Autofac.Containerbuilder builder)
    {
        base.Load(builder);

        builder.RegisterType(typeof(Foo1));
        builder.RegisterType(typeof(Foo2));
        builder.RegisterType(typeof(Foo3));
        builder.RegisterType(typeof(Foo4));
        builder.RegisterType(typeof(Foo5)); 

        // RegisterTypeSingleton() could be replaced by either
        // 1.registering directly here or 
        // 2.putting in ConfigureContainer() section in Startup
        builder.RegisterType(typeof(Foo6)).SingleInstance();
    }

   //public void RegisterTypeSingleton(Type type)
   //{
   //     Builder.RegisterType(type).SingleInstance();
   //}
}

Не забудьте добавить эту строку при создании хост-компоновщика.

hostBuilder.UseServiceProviderFactory(new AutofacServiceProviderFactory())

Это расширение c для autofa - пакет из Autofac.Extensions.DependencyInjection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...