小编Joh*_*all的帖子

使用Autofac返回不同范围内的不同组件

我有两个范围,一个嵌套在另一个范围内.当我解析特定服务时,我希望在一个根作用域中解析一个组件,在子作用域中解析另一个组件.有这么简单的方法吗?

我设法使用工厂类来确定当前范围是什么,然后返回适当的实例:

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
{
}
Run Code Online (Sandbox Code Playgroud)

这种方法存在许多问题:

  1. 我必须添加一个额外的类(或2 - 不确定IFooFactory是否真的有必要)
  2. 上面的代码不能处理嵌套在ParentScope中的其他范围.我可以通过将范围转换为Autofac.Core.Lifetime.LifetimeScope和检查ParentLifetimeScope属性来解决这个问题,但这可能不是特别安全的事情.

c# autofac

8
推荐指数
1
解决办法
2538
查看次数

标签 统计

autofac ×1

c# ×1