在提供程序中检索自定义绑定参数 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 访问参数的值需要两个参数:IContextITarget。我有 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。你可以改为

但是,如果类型数量有限,我会考虑改用抽象工厂