我正在使用Scoped生活方式为CastleWindsor的代码中的某些依赖项,并在这样的范围内解析它们:
using (_container.BeginScope())
{
_implementation = _container.Resolve<IAbstration>();
}
Ninject是否有这种行为的类比?
答案 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);
}