0

我想将我的用户对象注入到我的 Principal 对象中,如下所示:

kernel.Get<IPrincipal>(new ConstructorArgument("user", user));

这是IPrincipal构造函数的具体实现

public Principal(User user, IUserPermissions userPermissions)
{
    /* user is the correct instance, that I passed via ConstructorArgument */
}

直到这里我没有任何问题。用户对象可以很好地传递。

但是IUserPermissions 并没有收到这个对象。相反,ninject 创建了一个新的 User 实例。这里是 IUserPermissions 构造函数的具体实现:

public UserPermissions(User user, IDomainRoleValidator domainRoleValidator)
{
    /* user is a fresh instance, **not** the one I passed via ConstructorArgument */
}

我怎样才能让它工作而不必添加像“SetUser”这样的新方法?

4

1 回答 1

0

您需要确定绑定的范围。

目前,您有一个默认绑定,即InTransientScope.. 即,每次请求时它都会为您提供一个新实例。

您需要以另一种方式对其进行范围..也许每个请求一个(对于网络):

using Ninject.Web.Common;

Bind<IPrincipal>().To<ConcreteInstanceHere>().InRequestScope();

或在线程范围内:

Bind<IPrincipal>().To<ConcreteInstanceHere>().InThreadScope();

这些将为您提供相同的实例,用于它们各自的范围。

于 2013-08-08T10:30:11.860 回答