Ioc container 在Ninject 2.0中,如何同时具有一般绑定和特定案例的绑定?

Ioc container 在Ninject 2.0中,如何同时具有一般绑定和特定案例的绑定?,ioc-container,ninject,ninject-2,Ioc Container,Ninject,Ninject 2,在这种情况下,我需要依赖注入我的用户对象,但也要将当前用户放在IoC容器中。我希望以下几行能够起作用: kernel.Get<User>(); // Should return a new User() kernel.Get<User>("Current"); // Should return the current user kernel.Get();//应返回一个新用户() kernel.Get(“当前”);//应返回当前用户 有人可能会认为这样的绑定可以工作:

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

kernel.Get<User>(); // Should return a new User()
kernel.Get<User>("Current"); // Should return the current user
kernel.Get();//应返回一个新用户()
kernel.Get(“当前”);//应返回当前用户
有人可能会认为这样的绑定可以工作:

Bind<User>().ToSelf();
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current");
Bind().ToSelf();
Bind().ToMethod(LoadCurrentUser).InRequestScope().Named(“Current”);
当然,这会带来:

Ninject.ActivationException: Error activating User More than one matching bindings are available. Activation path: 1) Request for User Suggestions: 1) Ensure that you have defined a binding for User only once. Ninject.ActivationException:激活用户时出错 有多个匹配绑定可用。 激活路径: 1) 用户请求 建议: 1) 确保仅为用户定义了一次绑定。 我理解这个错误,因为命名绑定不限制该绑定的应用,所以两个绑定都适用。显然,我需要将上下文绑定与.When*()方法结合使用,但我想不出任何方法来实现这一点。我觉得应该有一些方法来检测是否应用了命名实例。比如:

// Not valid Ninject syntax
Bind<User>().ToSelf().WhenUnnamedRequested();
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current");
//无效的Ninject语法
Bind().ToSelf().whenNamedRequested()时;
Bind().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named(“当前”);

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

邮件列表上回答了这个问题:


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

如果您正在以更好、更喜欢的方式执行此操作,并将用户注入到需要它作为依赖项的对象中,则有两个选项:

  • 更简单的一个:为第一个绑定指定一个名称,并为参数添加一个命名属性,例如:ctor([named(“NewUser”)IUser NewUser,[named(“Current”)]IUser 当前用户)
  • 或首选方法使实现类不受IoC框架的影响:指定自定义属性并将其添加到参数中,例如:ctor([NewUser]IUser NewUser,[CurrentUser]IUser CurrentUser)。将绑定更改为:

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

  • 很抱歉,响应延迟太长,我无法执行这两项操作,因为当请求新用户时,这是通过NHibernate进行的。因此,我无法为其添加名称或属性。在需要当前用户的情况下,我可以这样做,但新用户绑定仍然适用。