0

我正在尝试在我们的应用程序中使用 Ninject 绑定服务并指定构造函数参数。构造函数参数是一个可以从查询字符串或 cookie 中提取的值。我们目前拥有的代码是这样的

kernel.Bind<SomeService>()
      .ToSelf()
      .InRequestScope()
      .WithConstructorArgument("someID", ctx =>
           // Try to get it from the posted form values
           System.Web.HttpContext.Current.Request.Form["someID"] != null ? 
           long.Parse(System.Web.HttpContext.Current.Request.Form["someID"]) :                                          

           // Try to get it from the query string
           System.Web.HttpContext.Current.Request.QueryString["someID"] != null ?
           long.Parse(System.Web.HttpContext.Current.Request.QueryString["someID"]) 

           : 0);

这有效,但非常难看。我意识到还有其他方法可以实现这一点,例如将 Form 值或 QueryString 值作为参数传递,但我们喜欢在 Binding 中定义它。理想情况下,我们想做的是这样的:

   kernel.Bind<SomeService>()
          .ToSelf()
          .InRequestScope()
          .WithConstructorArgument("someID", ctx => GetSomeID());

据我所知,这是不可能的。是否有另一种方法可以将构造函数参数注入逻辑分解为另一种方法,这样我们就不必嵌套一行 if 语句?

4

1 回答 1

1

我建议通过接口绑定对查询字符串/HTTP 表单的依赖。这种方法似乎更符合依赖注入模式(从特定实现和类中解耦代码)。

public interface IParameters
{
    string SomeID { get; }
}

public class ParametersFromHttpContext
{
    IQueryString _queryString;
    IRequestForm _requestForm;

    public ParametersFromHttpContext(IQueryString queryString, IRequestForm requestForm)
    {
        _queryString = queryString;
        _requestForm = requestForm;
    }

    public string SomeID
    {
        get
        {
            return
                // Try to get it from the posted form values
               _requestForm["someID"] != null ? 
               long.Parse(_requestForm["someID"]) :                                          

               // Try to get it from the query string
               _queryString["someID"] != null ?
               long.Parse(_queryString["someID"]) 

               : 0;
        }
    }
}

现在您想要的逻辑可以包含在绑定中,而无需在内核中引用 HttpContext。

kernel.Bind<IParameters>().To<ParametersFromHttpContext>();
于 2012-09-28T19:12:52.743 回答