我正在尝试绑定服务并在我们的应用程序中使用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语句?
答案 0 :(得分: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>();