У нас есть сервис 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
}
}
Кто-нибудь знает, почему мы получаем ошибку, но только в реальной среде?