Ninject中的CastleWindsor BeginScope模拟

时间:2016-11-04 14:33:11

标签: ninject castle-windsor

我正在使用Scoped生活方式为CastleWindsor的代码中的某些依赖项,并在这样的范围内解析它们:

  using (_container.BeginScope())
  {
      _implementation = _container.Resolve<IAbstration>();
  }

Ninject是否有这种行为的类比?

1 个答案:

答案 0 :(得分:1)

内置任何内容,但您可以通过创建继承自DisposableObject的自定义类轻松添加此功能:

sealed class Scope : DisposableObject { }

您必须在活动线程或异步上下文中存储Scope个实例,例如使用AsyncLocal<T>

static readonly AsyncLocal<Scope> scopeProvider = new AsyncLocal<Scope>();

现在,您可以创建使用BeginScope()的自定义scopeProvider方法,如下所示:

static Scope BeginScope() => scopeProvider.Value = new Scope();

现在您可以实现您的用例:

using (BeginScope())
{
    _implementation = _kernel.Get<IAbstration>();
}

可以使用InScope方法注册作用域实例:

static Scope RequestScope(IContext context) => scopeProvider.Value;

void Configure() 
{
    IKernelConfiguration config = new KernelConfiguration();

    config.Bind<IUserService>().To<AspNetUserService>().InScope(RequestScope);
}