注入到方法绑定中
本文关键字:绑定 方法 注入 | 更新日期: 2023-09-27 18:13:15
我不太确定如何问这个问题,所以我将只是张贴我的代码样本,并给出一个简短的描述,我正在尝试做什么。我设置了以下绑定:
kernel.Bind<IAuthenticationService>().To<FormsAuthenticationService>();
kernel.Bind<IAuthenticationService>().To<TokenAuthenticationService>().When(r => HasAncestorOfType<MyWebApiController>(r));
下面是hasoroftype的代码(尽管我认为它在这里无关紧要):
private static bool HasAncestorOfType<T>(IRequest request)
{
if (request.Target == null)
return false;
if (request.Target.Member.ReflectedType == typeof(T))
return true;
return HasAncestorOfType<T>(request.ParentRequest);
}
这些绑定都按预期工作(IAuthenticationService
绑定到FormsAuthenticationService
,除非注入到MyWebApiController
,在这种情况下它绑定到TokenAuthenticationService
)。但是,我想创建一个像这样的工厂绑定,以便ICurrentCompany
绑定到从IAuthentcationService
创建的对象:
kernel.Bind<ICurrentCompany>().ToMethod(x => new Company { CompanyId = x.Kernel.Get<IAuthenticationService>().User.CompanyId});
这行不通。IAuthenticationService
总是绑定到FormsAuthenticationService
。
您的解决方案不起作用的原因很简单,request.Target
不能成为控制器,因为您正在通过"您自己"请求(请求)实例- kernel.Get<>()
我将Company
设置为:
public class Company : ICurrentCompany{
public int CompanyId { get; private set;}
public class Company(IAuthenticationService authenticationService){
this.CompanyId = authenticationService.User.CompanyId;
}
}
,然后直接绑定:
kernel.Bind<ICurrentCompany>().To<Company>();
那么request.Target
将是控制器(在请求层次结构的根),您将得到正确的服务实现。