0

我有一个 Windows 服务项目,我使用 Autofac 作为 IOC 容器。该服务正在“嗅探”来自交换服务器的邮件,因此每当交换服务器上发生某些事件时,我的 Windows 服务都会检查该新项目是否应该复制到交换服务器以外的其他地方。

对于每个事件(邮件发送、邮件接收、新任务等),我希望有一个唯一的会话 id,我可以用它来记录。然后更容易在日志中追踪交换服务器事件(使用 NLog)。

我尝试了以下方法,但每次都会得到一个新的指导。我只希望每个会话/交换服务器事件有一个新的 guid:

在我的 autofac 设置类(bootstrapper.cs)

builder.RegisterType<SessionService>().As<ISessionService>()
    .InstancePerLifetimeScope();

我也试过这个,但结果相同:

builder.RegisterType<SessionService>().As<ISessionService>()

我的会话服务实现:

public class SessionService : ISessionService
{
    private readonly Guid _sessionGuid;

    public SessionService()
    {
        _sessionGuid = Guid.NewGuid();
    }

    public Guid GetNewSessionGuid()
    {
        return _sessionGuid;
    }
}

然后,例如,当我试图将信息从交换服务器事件保存到其他系统时,我必须记录一些东西。可能只是信息,也可能是错误,无论哪种方式,它都应该是事件的相同指南。

因此,例如在我的PushNotificationListener课堂上,我使用属性注入:

public ILogger Logger
{
    get
    {
        using (var scope = IocContainer.Container.BeginLifetimeScope())
        {
            return scope.Resolve<ILogger>();
        }
    }
}

public ILogFormater LogFormater
{
    get
    {
        using (var scope = IocContainer.Container.BeginLifetimeScope())
        {
            return scope.Resolve<ILogFormater>();
        }
    }
}

public ISessionService SessionService
{
    get
    {
        using (var scope = IocContainer.Container.BeginLifetimeScope())
        {
            return IocContainer.Container.Resolve<ISessionService>();
        }
    }
}

然后我像这样为 guid 调用 sessionservice:

Logger.LogInfo(LogFormater.EventLogFormat(
    SessionService.GetNewSessionGuid(),
    exchangeEventType.ToString(),
    message.Notification.ItemsElementName[count].ToString(),
    _service.ImpersonatedUserId.Id,
    mailEvent.TimeStamp));

在我的 MailService 类中,我首先拥有构造函数,因此您可以看到依赖注入:

public MailService(
    ILogger logger,
    ILogFormater logFormater,
    ISessionService sessionService)
{
    _logger = logger;
    _logFormater = logFormater;
    _sessionService = sessionService;
}

例如,当新邮件保存在另一个系统中时,我调用会话 guid:

_logger.LogInfo(_sessionService.GetNewSessionGuid().ToString());

在 PushNotificationListener 类和 MailService 类中对 _sessionService.GetNewSessionGuid() 方法的调用给了我两个不同的 guid。

我希望他们成为同一个向导。我怎么做?

4

1 回答 1

0

问题是由您在PushNotificationListener类中的属性引起的。由于您在它们中创建了新的生命周期范围,因此将在该范围内SessionService创建一个新的。防止这样做。

相反,每个会话应该只有一个生命周期范围。您应该在引发事件之后和解析根对象之前直接创建一个新的生命周期范围(并且只有一个生命周期范围)。从那时起,所有依赖项都应该使用构造函数注入来注入。这确保了在该范围内,只有一个SessionService.

于 2013-08-07T07:34:10.603 回答