我有一个 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。
我希望他们成为同一个向导。我怎么做?