我有一个由多种类型实现的接口。但在我做之前,kernel.GetAll<IAmServiceable>()
我希望能够思考注射的目标类型。
我知道该函数kernel.GetBindings(typeof(IAmServiceable))
存在,但这会返回一个IBinding
's 列表。
有谁知道我如何从 中获取目标类型IBinding
?
我想知道在IAmServiceable
实例化之前绑定的类型。
我有一个由多种类型实现的接口。但在我做之前,kernel.GetAll<IAmServiceable>()
我希望能够思考注射的目标类型。
我知道该函数kernel.GetBindings(typeof(IAmServiceable))
存在,但这会返回一个IBinding
's 列表。
有谁知道我如何从 中获取目标类型IBinding
?
我想知道在IAmServiceable
实例化之前绑定的类型。
我知道您的问题现在可能有点晚了,但是自从我今天遇到这个问题以来,我认为其他人也可能会这样做。
那是我最终想出的代码-我认为它并不完美(远非如此),尤其是在性能方面,但它适用于我的情况,并且由于我不打算经常调用此方法,因此似乎可以我。
public Type GetBoundToType(IKernel kernel, Type boundType)
{
var binding = kernel.GetBindings(boundType).FirstOrDefault();
if (binding != null)
{
if (binding.Target != BindingTarget.Type && binding.Target != BindingTarget.Self)
{
// TODO: maybe the code below could work for other BindingTarget values, too, feelfree to try
throw new InvalidOperationException(string.Format("Cannot find the type to which {0} is bound to, because it is bound using a method, provider or constant ", boundType));
}
var req = kernel.CreateRequest(boundType, metadata => true, new IParameter[0], true, false);
var cache = kernel.Components.Get<ICache>();
var planner = kernel.Components.Get<IPlanner>();
var pipeline = kernel.Components.Get<IPipeline>();
var provider = binding.GetProvider(new Context(kernel, req, binding, cache, planner, pipeline));
return provider.Type;
}
if (boundType.IsClass && !boundType.IsAbstract)
{
return boundType;
}
throw new InvalidOperationException(string.Format("Cannot find the type to which {0} is bound to", boundType));
}
这是不可能的。例如,在这种情况下,类型是什么?
Bind<IX>().ToMethod(c => RandomBool() ? new Foo() : new Bar());
如果您正在使用NinjectModule
(或可以访问IKernel
其他方式)一个不错的简单方法是:
var concreteType = Kernel.Get<InterfaceType>().GetType();
显然,缺点是您创建了具体类型的实例。尽管如此,它还是很好很简单,而且我认为它非常健壮。显然,如果接口派生自 IDisposable 您将使用 using 语句:
using(var obj = Kernel.Get<InterfaceType>())
{
var concreteType = obj.GetType();
.
.
.
}