如何根据生命周期作用域名称进行解析

本文关键字:域名 作用域 何根 生命 周期 作用 | 更新日期: 2023-09-27 18:06:09

我在同一个windows服务中有一个具有多个逻辑服务(队列)的项目,我试图配置每个服务以拥有自己的日志文件。因此,我将设置文件管理器的命名实例:

cb.RegisterType<LogFileHandler>()
  .Named<LogFileHandler>("Project1")
  .WithParameter("filename", "c:''project1.txt")
  .SingleInstance();
cb.RegisterType<LogFileHandler>()
  .Named<LogFileHandler>("Project2")
  .WithParameter("filename", "c:''project2.txt")
  .SingleInstance();

masstrtransit集成为每个服务创建了一个命名/标记的作用域,但似乎没有办法在注册中获得此信息。例如,如果我能这样做就太好了:

cb.Register((x) => x.ResolveNamed<LogFileHandler>(x.Tag))

x。但是,标签不存在,那么是否有一种基于作用域名称进行区分的方法?或者是更好的方法?

如何根据生命周期作用域名称进行解析

您可以解析ILifetimeScope以获取寄存器方法上的Tag信息。

builder.RegisterType<LogFileHandler>()
       .Named<LogFileHandler>("Project1")
       .WithParameter("filename", "c:''project1.txt")
       .SingleInstance();
builder.RegisterType<LogFileHandler>()
       .Named<LogFileHandler>("Project2")
       .WithParameter("filename", "c:''project2.txt")
       .SingleInstance();

builder.Register(c => {
            String tag = c.Resolve<ILifetimeScope>().Tag as String; 
            return c.ResolveNamed<LogFileHandler>(tag); 
       })
       .As<LogFileHandler>();

它应该工作,但如果你有一个子作用域或Owned依赖Tag将不存在于此解决的ILifetimeScope。要解决这个问题,您可以解析ISharingLifetimeScope并检查Parent属性。

builder.Register(c =>
{
    String tag;
    ISharingLifetimeScope scope = c.Resolve<ISharingLifetimeScope>();
    while (scope != null)
    {
        if (scope.Tag is String
            && new String[] { "Project1", "Project2" }.Contains((String)scope.Tag))
        {
            tag = (String)scope.Tag;
            break;
        }
        scope = scope.ParentLifetimeScope;
    }
    return c.ResolveNamed<LogFileHandler>(tag);
})
.As<LogFileHandler>();

ISharingLifetimeScope只有在直接从IContainer而不是从子生命周期作用域解析时才会解析为null