注入到方法绑定中

本文关键字:绑定 方法 注入 | 更新日期: 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将是控制器(在请求层次结构的根),您将得到正确的服务实现。