1

我不太确定如何问这个问题,所以我将发布我的代码示例并简要描述我正在尝试做的事情。我有以下绑定设置:

kernel.Bind<IAuthenticationService>().To<FormsAuthenticationService>();
kernel.Bind<IAuthenticationService>().To<TokenAuthenticationService>().When(r => HasAncestorOfType<MyWebApiController>(r));

这是 HasAncestorOfType 的代码(尽管我认为这无关紧要):

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

4

1 回答 1

1

您的解决方案不起作用的原因很简单,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将成为控制器(位于请求层次结构的根),您将获得正确的服务实现。

于 2013-05-13T15:54:01.420 回答