如何为每个用户创建一个Ninject范围

本文关键字:一个 范围 Ninject 创建 用户 | 更新日期: 2023-09-27 18:15:40

对于Windows Phone应用程序,其中多个用户可以登录/注销,我想确保在一个用户范围内创建的对象(并为该用户重用)永远不会在新用户登录时重用,即。我需要擦除内部状态

关于如何为Ninject做到这一点有什么好的实践吗?我所能找到的就是创建一个自定义作用域对象,这在我看来有点难看:

public sealed class UserScopeObject
{
}
public sealed class UserScope
{
    public static UserScopeObject Current { get; set; }
}
Bind<IFoo>().To<Foo>().InScope(x => UserScope.Current);

然后当用户登录/注销时:

UserScope.Current = new UserScopeObject();

如何为每个用户创建一个Ninject范围

如果在用户登录时不重新创建对象图,则作用域将无法帮助您。它不能从一些非用户特定的对象中"窃取"用户特定的对象。

所以您需要重新创建对象树。如果你这样做,你甚至需要一个作用域吗?您能否在注销时取消对树中特定于用户的部分的引用,并在登录时重新创建它?

只有当你需要像"每个用户单例"这样的东西时才需要。如果是这样,你可以使用自定义的用户作用域(提示:你可以做UserScopeObject : INotifyWhenDisposed,让Ninject释放所有作用域对象,一旦UserScopeObject被处置),或者你也可以使用其他的作用域,如命名作用域(见命名作用域扩展)。

如果你在用户登录时重新创建对象树的一部分,你可以有特定于用户的根节点DefinesNamedScope("User"),并且所有不能是瞬时的/需要"单例"的对象都可以定义为.InNamedScope("User")

也许你甚至可以实现你想要的"InCallScope()"