基于http方法(GET或POST)的Ninject绑定

时间:2015-05-27 11:23:42

标签: c# asp.net-mvc ninject

我使用Ninject使用构造函数注入绑定服务类。

我的问题是:

我有一个类(控制器)User,它在构造函数中使用接口IService

IServiceUowServiceReadonlyService实施。

现在,如果网络请求是ReadonlyService,我想要注入GET。但UowServicePOST。此外,它只应配置类User,这意味着此绑定不应影响任何其他类。

我知道我可以像这样绑定User

kernel.Bind<IService>().To<ReadonlyService>().WhenInjectedInto<User>()

并且,以下可以用于根据http方法绑定

kernel.Bind<IService>().ToMethod(ctx => 
{
    var verb = HttpContext.Current..HttpMethod;
    if (verb == "GET")
    {
        return kernel.Get<ReadonlyService>();
    }

    return kernel.Get<IService>();
});

但如何结合这两个条件?另外,有没有更好,更直接的方法呢?

1 个答案:

答案 0 :(得分:1)

您可以将自定义条件基于.When(ctx => ...方法。以下绑定仅适用于:

  • 注入User
  • HttpContext.Current.Request.HttpMethod == "GET"

    kernel.Bind<IService>().To<ReadonlyService>()
      .When(r => 
           {
               // return false if not injected into User
               if (r.Target == null)
               {
                   return false;
               }
               if(!typeof(User)
                  .IsAssignableFrom(r.Target.Member.ReflectedType))
               {
                   return false;
               }
    
               return HttpContext.Current.Request.HttpMethod == "GET";
           });