在提供程序中检索自定义绑定参数 Ninject
Retrieve Custom Binding Parameters in Provider Ninject
您好,我在 Xamarin
MVVM
项目中使用 Ninject
。我想做的是根据枚举类型绑定特定的实现:
var foo = new Ninject.Parameters.Parameter("type", VMType, true);
Kernel.Get<ICommonComponentVM>(foo);
和提供商:
public class ICommonComponentVMProvider : Provider<ICommonComponentVM>
{
protected override ICommonComponentVM CreateInstance(IContext context)
{
//return the implementation based on type
}
}
在内核模块中绑定为:
public class CoreModule : NinjectModule
{
public override void Load()
{
Bind<ICommonComponentVM>().ToProvider<ICommonComponentVMProvider>();
}
}
如何从绑定中提取自定义参数 IContext
?
或者这是执行此操作的正确方法吗? Ninject wiki 缺少此信息。
编辑
我到达了
var param = context.Parameters.Single((arg) => arg.Name == "type");
但是使用 param.GetValue
访问参数的值需要两个参数:IContext
和 ITarget
。我有 context
但我应该把什么写成 Target
?
同时它与 null
:
一起工作
var type = (CommonVMTypes)param.GetValue(context, null);
所以看起来像这样:
protected override ICommonComponentVM CreateInstance(IContext context)
{
var param = context.Parameters.Single((arg) => arg.Name == "type");
if (param == null){
return null;
}
var type = (CommonVMTypes)param.GetValue(context, null); //<-- Needs an Action ITarget
switch (type)
// ...
}
您可以通过属性 ICollection<IParameter> IContext.Parameters
访问参数。您可以使用 context.Parameters.Single(x => x.Name == "type")
.
找到它
您还可以子类化 Parameter
或为具有强类型信息的自定义参数类型实现 IParameter
p.Ex。 ComponentVMTypeParameter
然后 select 使用 context.Parameters.OfType<ComponentVMTypeParameter>().Single()
.
替代方法:
- 使用条件绑定(
When(...)
语法,也可以检查参数)而不是提供程序。不需要扩展提供程序。
- 使用 factory 而不是提供商。
- 使用命名绑定:
Bind<IFoo>().To<Foo1>().Named("Foo1")
IResolutionRoot.Get<IFoo>("Foo1");
但是,原则上不需要使用IProvider
。你可以改为
但是,如果类型数量有限,我会考虑改用抽象工厂
您好,我在 Xamarin
MVVM
项目中使用 Ninject
。我想做的是根据枚举类型绑定特定的实现:
var foo = new Ninject.Parameters.Parameter("type", VMType, true);
Kernel.Get<ICommonComponentVM>(foo);
和提供商:
public class ICommonComponentVMProvider : Provider<ICommonComponentVM>
{
protected override ICommonComponentVM CreateInstance(IContext context)
{
//return the implementation based on type
}
}
在内核模块中绑定为:
public class CoreModule : NinjectModule
{
public override void Load()
{
Bind<ICommonComponentVM>().ToProvider<ICommonComponentVMProvider>();
}
}
如何从绑定中提取自定义参数 IContext
?
或者这是执行此操作的正确方法吗? Ninject wiki 缺少此信息。
编辑
我到达了
var param = context.Parameters.Single((arg) => arg.Name == "type");
但是使用 param.GetValue
访问参数的值需要两个参数:IContext
和 ITarget
。我有 context
但我应该把什么写成 Target
?
同时它与 null
:
var type = (CommonVMTypes)param.GetValue(context, null);
所以看起来像这样:
protected override ICommonComponentVM CreateInstance(IContext context)
{
var param = context.Parameters.Single((arg) => arg.Name == "type");
if (param == null){
return null;
}
var type = (CommonVMTypes)param.GetValue(context, null); //<-- Needs an Action ITarget
switch (type)
// ...
}
您可以通过属性 ICollection<IParameter> IContext.Parameters
访问参数。您可以使用 context.Parameters.Single(x => x.Name == "type")
.
您还可以子类化 Parameter
或为具有强类型信息的自定义参数类型实现 IParameter
p.Ex。 ComponentVMTypeParameter
然后 select 使用 context.Parameters.OfType<ComponentVMTypeParameter>().Single()
.
替代方法:
- 使用条件绑定(
When(...)
语法,也可以检查参数)而不是提供程序。不需要扩展提供程序。 - 使用 factory 而不是提供商。
- 使用命名绑定:
Bind<IFoo>().To<Foo1>().Named("Foo1")
IResolutionRoot.Get<IFoo>("Foo1");
但是,原则上不需要使用IProvider
。你可以改为
但是,如果类型数量有限,我会考虑改用抽象工厂