【问题标题】:Inject custom object via ConstructorArgument in dependant objects通过 ConstructorArgument 在依赖对象中注入自定义对象
【发布时间】:2013-08-08 10:27:07
【问题描述】:

我想像这样将我的用户对象注入到我的 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”这样的新方法的情况下让它工作?

【问题讨论】:

    标签: c# ninject


    【解决方案1】:

    您需要确定绑定的范围。

    目前,您有一个默认绑定,即InTransientScope.. 也就是说,每次请求它都会给您一个新实例。

    您需要以另一种方式确定它的范围。也许每个请求一个(对于网络):

    using Ninject.Web.Common;
    
    Bind<IPrincipal>().To<ConcreteInstanceHere>().InRequestScope();
    

    或者在线程范围内:

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

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

    【讨论】:

    • InRequestScope 已被删除(我认为是有原因的)。而且 InThreadScope 在这里不适用。
    • InRequestScopeNinject.Web.Common.dll 的一部分。不是Ninject.dll 的一部分。无论哪种方式,答案都是一样的。您的范围不正确。默认范围是InTransientScope.. 这是每次调用kernel.Get&lt;T&gt;的一个新实例。
    • 我实际上更愿意在没有范围的情况下这样做。除非我可以为那个 Get 调用定义一个范围......
    • “没有范围”就是你所拥有的。没有范围。给它一个范围,就是给它一个在该范围内提供相同实例的理由。为什么每次调用都需要一个新实例?这太疯狂了……尤其是如果这是一个网络应用程序。您每次都在创建全新的对象,而不是在请求的整个生命周期内共享它们...
    • 重点是,父对象已经被“限定”了,因此也不需要对子对象进行限定。如果我想在这个请求的某处将不同的用户注入到不同的对象中怎么办?
    猜你喜欢
    • 2013-03-03
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2022-01-11
    相关资源
    最近更新 更多