【问题标题】:In Ninject 2.0, how do I have both a general binding and a binding for a specific case?在 Ninject 2.0 中,我如何同时拥有通用绑定和特定情况的绑定?
【发布时间】:2011-04-10 07:35:58
【问题描述】:

我有一种情况,我想依赖注入我的用户对象,但也将当前用户放在 IoC 容器中。我希望以下几行起作用:

kernel.Get<User>(); // Should return a new User()
kernel.Get<User>("Current"); // Should return the current user

有人可能会认为这样的绑定会起作用:

Bind<User>().ToSelf();
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current");

当然,这给出了:

Ninject.ActivationException:激活用户时出错
有多个匹配的绑定可用。
激活路径:
1) 用户请求

建议:
1) 确保您只为 User 定义了一次绑定。

我理解这个错误,因为命名绑定不限制该绑定的应用,所以两个绑定都适用。很明显,我需要将上下文绑定与 .When*() 方法一起使用,但我想不出任何方法来做到这一点。我觉得应该有检测是否应用了命名实例的方法。比如:

// Not valid Ninject syntax
Bind<User>().ToSelf().WhenUnnamedRequested();
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current");

我在IRequest 接口上找不到任何位置,或者它的属性告诉我请求的名称。我该怎么做?

【问题讨论】:

    标签: ioc-container ninject ninject-2


    【解决方案1】:

    这个问题在邮件列表中得到了回答: http://groups.google.com/group/ninject/browse_thread/thread/cd95847dc4dcfc9d?hl=en


    如果您通过在内核上调用 Get 来访问用户(我希望您不要这样做),那么也给第一个绑定一个名称,并始终按名称访问用户。实际上,有一种方法可以从没有名称的绑定中获取实例。但是因为我衷心建议不要这样做,所以我不会在这里展示如何做到这一点。如果你仍然想这样做,我稍后会告诉你这是如何工作的。

    如果您以更好和首选的方式进行操作,并将用户注入到需要它作为依赖项的对象,则有两种选择:

    1. 更简单的:给第一个绑定一个名称,并为参数添加一个命名属性,例如ctor([Named("NewUser") IUser newUser, [Named("Current")] IUser 当前用户)
    2. 或首选方式使实现类不受 IoC 框架的影响:指定自定义属性并将它们添加到参数中,例如ctor([NewUser] IUser newUser,[CurrentUser]IUser currentUser)。将绑定更改为:

      Bind<User>().ToSelf()
                  .WhenTargetHas<NewUserAttribute>();
      Bind<User>().ToMethod(LoadCurrentUser)
                  .InRequestScope()
                  .WhenTargetHas<CurrentUserAttribute>();
      

    【讨论】:

    • 很抱歉长时间的响应延迟,我不能做这些,因为当请求一个新用户时,这是通过 NHibernate 发生的。所以我不能为其添加名称或属性。我可以在我想要当前用户的情况下,但新的用户绑定仍然适用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    相关资源
    最近更新 更多