Dynami c Регистрация типа в Autofa c C# с использованием неизвестного типа - PullRequest
1 голос
/ 14 марта 2020

Я пытаюсь создать контейнер autofa c, которому передается список служб для регистрации для использования в ряде проектов.

У меня есть базовый конструктор контейнеров со всеми необходимые типы в ряде свойств, однако мне нужно затем добавить список служб из класса, используя эту базу.

что у меня есть:

        private void buildAutofacContainer(IServiceCollection services, List<ServiceDescriptor> servicesToAdd)
    {
        var builder = new ContainerBuilder();
        builder.Register(x => new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddEnvironmentVariables()
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .Build()).As<IConfigurationRoot>().SingleInstance();
        builder.RegisterType<LoggingInterceptor>();
        builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>();
        builder.RegisterType<ApplicationEngine>().As<IApplicationEngine>();
        builder.RegisterType<ApplicationSettings>().As<IApplicationSettings>();
        builder.RegisterType<PortalUnitOfWorkFactory>().As<IPortalUnitOfWorkFactory>();
        builder.RegisterType<DataConnectionService>().As<IDataConnectionService>();
        builder.Populate(services);
        this.Container = builder.Build();
    }

Что я пытаюсь делать:

            servicesToAdd.ForEach(o =>
        {
            object concrete = o.ImplementationInstance;
            Type type = o.ImplementationType;
            builder.RegisterType<concrete>().As<type>();
        });

любая помощь будет принята с благодарностью

1 Ответ

2 голосов
/ 14 марта 2020

Я не уверен, правильно ли я вас понимаю. Если цель состояла в том, чтобы добавить список дескрипторов служб в конструктор контейнеров / контейнеров Autofa c, вы могли бы заполнить эти дескрипторы на services, поскольку IServiceCollection представляет собой набор дескрипторов служб.

    void BuildBaseContainer(IServiceCollection services, List<ServiceDescriptor> servicesToAdd)
    {
        foreach (var descriptor in servicesToAdd)
        {
            services.Add(descriptor);
        }

        var builder = new Autofac.ContainerBuilder();
        builder.Populate(servicesToAdd);
        this.Container = builder.Build();
    }

Или, если ваша цель состояла в том, чтобы зарегистрировать объект / экземпляр как тип, известный только во время выполнения, вы можете использовать метод non-generi c As(params Type[]) и передать тип методу:

// Could also use descriptor.ImplementationType depends on your ServiceDescriptor.
var concreteType = descriptor.ImplementationInstance.GetType();
builder.RegisterType(concreteType)
        .As(descriptor.ImplementationType) // As implementation type
        .As(<other type>) // As any other type
        .AsSelf() // As the object's type
        .As(descriptor.ImplementationInstance.GetType()) // As the implementation instance type
        .AsImplementedInterfaces() // As all implemented interface types
        ;
...