gpt4 book ai didi

asp.net-mvc - Ninject 与 HttpContext.Current 上的 MVC4 条件绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 10:52:03 26 4
gpt4 key购买 nike

我对 Ninject 不是很有经验,所以我在这里的概念可能完全错误,但这就是我想做的。我有一个 Multi-Tenancy Web 应用程序,我想根据用于访问我网站的 URL 注入(inject)不同的类对象。

类似于此,虽然也许我可以在绑定(bind)中使用 .When(),但您明白了:

    private static void RegisterServices(IKernel kernel)
{
var currentTenant = TenantLookup.LookupByDomain(HttpContext.Current.Request.Url.Host.ToLower());
if (currentTenant.Foldername == "insideeu")
{ kernel.Bind<ICustomerRepository>().To<AXCustomerRepository>(); }
else
{ kernel.Bind<ICustomerRepository>().To<CustomerRepository>(); }
...

问题是此时 HttpContext.Current 为空。所以我的问题是如何在 NinjectWebCommon.RegisterServices 中获取 HttpContext 数据。对于 Ninject 可能出错的任何方向,我们也将不胜感激。

谢谢

最佳答案

问题是你在这里的绑定(bind)在编译时解析;而您需要它在运行时为每个请求解析。为此,请使用 ToMethod:

Bind<ICustomerRepository>().ToMethod(context => 
TenantLookup.LookupByDomain(HttpContext.Current.Request.Url.Host.ToLower()).Foldername == "insideeu"
? new AXCustomerRepository() : new CustomerRepository());

这意味着,每次调用 ICustomerRepository 时,NInject 都会使用当前的 HttpContext 运行该方法,并实例化适当的实现。

请注意,您还可以使用 Get 来解析类型而不是特定的构造函数:

Bind<ICustomerRepository>().ToMethod(context => 
TenantLookup.LookupByDomain(HttpContext.Current.Request.Url.Host.ToLower())
.Foldername == "insideeu" ?
context.Kernel.Get<AXCustomerRepository>() : context.Kernel.Get<CustomerRepository>()
as ICustomerRepository);

关于asp.net-mvc - Ninject 与 HttpContext.Current 上的 MVC4 条件绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18005232/

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