Как получить имя среды внутри Autofac - метод configureContainer - PullRequest
0 голосов
/ 23 мая 2019

Я создаю консольное приложение .net core 2.1, используя autofac в качестве DI. Это консольное приложение использует MailServiceAdapter, который также используется внутри веб-API.

Я хотел бы передать имя среды в MailServiceAdapter, чтобы я мог добавить имя среды внутри темы.

мой MailServiceAdapter выглядит так:

public MailServiceAdapter(Func<Binding, EndpointAddress, MailServiceClient> mailServiceFactory, string environment)
        {
            ...

            _prefixSubject = environment;
        }

        public async Task SendMail(MailItem mailItem)
        {
            await _mailService.SendMailWithAttachmentsAsync(
                    mailItem.From,
                    mailItem.FromDisplay,
                    AggregateMailAdresses(mailItem.To),
                    AggregateMailAdresses(mailItem.Cc),
                    AggregateMailAdresses(mailItem.Bcc),
                    $"[{_prefixSubject}] {mailItem.Subject}",
                    mailItem.Message,
                    true,
                    mailItem.AttachmentNames.ToArray(),
                    mailItem.Attachments.ToArray()
                    );
        }

Мой метод Main внутри program.cs выглядит следующим образом. Внутри метода ConfigureContainer я хотел бы передать имя окружения моему MailServiceAdapter. Как я могу получить имя среды там?

public static async Task Main(string[] args)
        {
            await new HostBuilder()
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureHostConfiguration(configHost =>
            {
                configHost.SetBasePath(Directory.GetCurrentDirectory());
                configHost.AddJsonFile(_hostsettings, optional: true);
                configHost.AddEnvironmentVariables();
                configHost.AddCommandLine(args);
            })
            .ConfigureAppConfiguration((hostContext, configApp) =>
            {
                configApp.SetBasePath(Directory.GetCurrentDirectory());
                configApp.AddJsonFile(_appsettings, optional: true);
                configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true);
                configApp.AddEnvironmentVariables();
                configApp.AddCommandLine(args);
            })
            .ConfigureServices((hostContext, services) =>
            {
                ...
            })
            .ConfigureContainer<ContainerBuilder>(builder =>
            {
                builder.RegisterType<MailServiceClient>().As<MailServiceClient>().InstancePerDependency();
                builder.RegisterType<MailServiceAdapter>().As<IMailServiceAdapter>().WithParameter(new TypedParameter(typeof(string), "environmentName")).InstancePerLifetimeScope();
            })
            .UseConsoleLifetime()
            .Build()
            .RunAsync();
        }

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Я нашел решение:

.ConfigureContainer<ContainerBuilder>((context, builder) =>
            {
                var environmentName = context.HostingEnvironment.EnvironmentName;

                builder.RegisterType<MailServiceClient>().As<MailServiceClient>().InstancePerDependency();
                builder.RegisterType<MailServiceAdapter>().As<IMailServiceAdapter>().WithParameter(new TypedParameter(typeof(string), environmentName)).InstancePerLifetimeScope();
            })
0 голосов
/ 24 мая 2019

Почему бы просто не использовать?

Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

В документах написано

Извлекает значение переменной среды из текущей процесс.

...