gpt4 book ai didi

c# - 需要当前 Request.Url 的类型的 Ninject 绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 15:59:02 25 4
gpt4 key购买 nike

我在一个基于 MVC5 的网站中使用 Ninject 3,并试图找出如何让 DI 与一个类型一起工作,该类型测试传递到其构造函数中的 Uri.Host 值的属性。我希望绑定(bind)以某种方式提供当前 URL。我最初尝试的最小结构是:

public class StructuredUrlTester : IStructuredUrlTester
{
// Expose public getters for parts of the uri.Host value
bool MyBooleanProperty { get; private set; }

public StructuredUrlTester(Uri uri)
{
// Test the value of uri.Host and extract parts via regex
}
}

// In Global.asax.cs
public class MvcApplication : NinjectHttpApplication
{
protected override IKernel CreateKernel()
{
kernel.Bind<IStructuredUrlTester>()
.To<StructuredUrlTester>()
.InTransientScope();
.WithConstructorArgument("uri", Request.Url);
}
}

// In MyController.cs
public class MyController : Controller
{
private readonly IStructuredUrlTester _tester;

public ContentPageController(IStructuredUrlTester tester)
{
this._tester = tester;
}

public ActionResult Index()
{
string viewName = "DefaultView";
if (this._tester.MyBooleanProperty)
{
viewName = "CustomView";
}

return View(viewName);
}
}

由于 CreateKernel() 调用发生在 Request 对象可用之前,.WithConstructorArgument() 部分抛出异常(“系统.Web.HttpException:请求在此上下文中不可用”)。

我如何提供接口(interface)到具体类型的绑定(bind),同时还能够提供例如HttpContext.Current.Request.Url 值(在 Controller 中可用)到具体类型的构造函数,在运行时何时可用?

最佳答案

将所需的功能包装在抽象中:

public interface IUriProvider {
Uri Current { get; }
}

重构测试类:

public class StructuredUrlTester : IStructuredUrlTester {
// Expose public getters for parts of the uri.Host value
bool MyBooleanProperty { get; private set; }

public StructuredUrlTester(IUriProvider provider) {
Uri uri = provider.Current;
// Test the value of uri.Host and extract parts via regex
}
}

提供者实现应该包装 Request.Url:

public class UriProvider : IUriProvider {
public Uri Current { get { return HttpContext.Current.Request.Url; } }
}

请注意,Current 属性实际上应该在 HttpContext 及其请求可用的 Controller 的操作中调用。

关于c# - 需要当前 Request.Url 的类型的 Ninject 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42369323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com