C# 如何基于生存期作用域名称进行解析?

C# 如何基于生存期作用域名称进行解析?,c#,autofac,masstransit,C#,Autofac,Masstransit,我有一个在同一个windows服务中包含多个逻辑服务(队列)的项目,我正在尝试将每个逻辑服务(队列)配置为具有自己的日志文件。因此,我正在设置文件管理器的命名实例: cb.RegisterType<LogFileHandler>() .Named<LogFileHandler>("Project1") .WithParameter("filename", "c:\\project1.txt") .SingleInstance(); cb.RegisterTyp

我有一个在同一个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();
cb.RegisterType()
.命名(“项目1”)
.WithParameter(“文件名”,“c:\\project1.txt”)
.SingleInstance();
cb.RegisterType()
.命名(“项目2”)
.WithParameter(“文件名”,“c:\\project2.txt”)
.SingleInstance();
MassTransit集成为每个服务创建了一个命名/标记范围,但似乎没有办法在注册中获取此信息。例如,如果我能做这样的事情就太好了:

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

x、 但是标记不存在,所以有没有一种基于作用域名称的区分方法?或者一般来说是更好的方法?

您可以解析
ILifetimeScope
以获取寄存器方法的
标记信息

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>();

ISharingLifetimeScope
将被解析为
null
只有当您直接从
IContainer
而不是从儿童终生范围解析某个内容时才会被解析为
null。

太棒了,我从未想到过这一点。第一个解决方案目前已经足够了。
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>();