Autofa c говорит, что тип не зарегистрирован, происходит только в одной среде - PullRequest
0 голосов
/ 10 января 2020

У нас есть сервис Windows, использующий Topshelf. С его помощью мы проверяем, получаем ли мы сообщения из очереди сообщений, а затем отправляем почту. Он работает на моей локальной машине, внутренней тестовой среде и внешней тестовой среде. Однако, когда я развертываю его в реальной среде, в наших журналах я вижу, что мы получаем исключение при разрешении ISmtpMailService.

Я получаю ошибку ниже

An unhandled exception occurred while processing a registered user 0280ceb3-373f-4a3b-95ca-95e0cc23009a:
Autofac.Core.Registration.ComponentNotRegisteredException: The requested service 
'Mail.SMTP.Services.ISmtpMailService' has not been registered. To avoid this exception, either register
a component to provide the service, check for service registration using IsRegistered(), or use the 
ResolveOptional() method to resolve an optional dependency. at 
Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) at 
Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context, IEnumerable`1 parameters) at 
Autofac.ResolutionExtensions.Resolve[TService](IComponentContext context) at 
Web.Identity.QueueMonitor.MQ.QueueMonitor.<sendRegistrationConfirmationAsync>d__3.MoveNext() in 
D:\TeamCity\buildAgent\work\6d5b3b1d63a0a2d4\Web\Web.Identity.QueueMonitor\MQ\QueueMonitor.cs:line 94 --- End of stack trace from previous location where exception was thrown --- at 
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at 
System.Runtime.CompilerServices.TaskAwaiter.GetResult() at 
QueueMonitor.MQ.QueueMonitor.ReceivedHandler(Object sender, BasicDeliverEventArgs e) in 
D:\TeamCity\buildAgent\work\6d5b3b1d63a0a2d4\Web\Web.Identity.QueueMonitor\MQ\QueueMonitor.cs:line 65

Тогда у меня есть метод (ы), где я регистрирую контейнер Autofa c

        private static IContainer getContainer()
        {
            var builder = new ContainerBuilder();

            // Register Services from the BLL our application needs to function.
            registerServices(builder);

            // Build and return the container.
            return builder.Build();
        }

        private static void registerServices(ContainerBuilder builder)
        {

            // Register default mailclients
            builder.RegisterType<SmtpClient>().As<ISmtpClient>().SingleInstance();

            // Register base mailservices
            builder.RegisterType<SmtpMailService>().As<ISmtpMailService>().SingleInstance();
        }

Наконец, я вызываю метод, когда мы получаем сообщение из очереди, этот метод пытается разрешить ISmtpMailService.

        private static async Task sendRegistrationConfirmationAsync(MessageUserRegistered userRegistered)
        {
            using (var scope = getContainer().BeginLifetimeScope())
            {
                var mailService = scope.Resolve<ISmtpMailService>();

                // Extracted, sending mail here
           }
        }

Кто-нибудь знает, почему мы получаем ошибку, но только в реальной среде?

...