我不太确定如何问这个,所以我只是发布我的代码示例并简要描述我正在尝试做什么。我有以下绑定设置:
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
。
答案 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
将成为控制器(在请求层次结构的根目录下),您将获得正确的服务实现。