我有两个范围,一个嵌套在另一个内部。当我解析特定服务时,我希望在一个根范围内解析一个组件,在子范围内解析另一个组件。有没有一种简单的方法可以做到这一点?
我已经设法使用工厂类来确定当前范围是什么,然后返回适当的实例:
IContainer BuildContainer()
{
var builder = new ContainerBuilder();
// ...
builder.RegisterType<FooInParentScope>().AsSelf();
builder.RegisterType<FooInChildScope>().AsSelf();
builder.RegisterType<FooFactory>().AsImplementedInterfaces();
builder.Register<IFoo>(c => c.Resolve<IFooFactory>().GetFoo()).InstancePerLifetimeScope();
// ...
}
class FooFactory : IFooFactory
{
private readonly ILifetimeScope m_scope;
public FooFactory(ILifetimeScope scope)
{
m_scope = scope;
}
public IFoo GetFoo()
{
if (m_scope.Tag == "ParentScope")
return m_scope.Resolve<FooInParentScope>();
else
return m_scope.Resolve<FooInChildScope>();
}
}
class FooInParentScope : IFoo
{
}
class FooInChildScope : IFoo
{
}
这种方法存在许多问题:
- 我必须添加一个额外的类(或 2 个 - 不确定 IFooFactory 是否真的有必要)
- 上面的代码不处理嵌套在 ParentScope 中的其他范围。我可以通过将范围投射到属性
Autofac.Core.Lifetime.LifetimeScope
并检查ParentLifetimeScope
属性来解决这个问题,但这可能不是一件特别安全的事情。