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