注入ToMethod绑定

时间:2013-05-10 18:51:08

标签: c# dependency-injection ninject

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

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

1 个答案:

答案 0 :(得分: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将成为控制器(在请求层次结构的根目录下),您将获得正确的服务实现。