如何根据生命周期作用域名称进行解析
本文关键字:域名 作用域 何根 生命 周期 作用 | 更新日期: 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
。