2017-05-31 10 views
0

こんにちは私はXamarinMVVMプロジェクトでNinjectを使用しています。私は何をしようとしていると、列挙型に基づいて特定の実装をバインドすることです:プロバイダの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にはこの情報が欠けています。

EDIT

私は

var param = context.Parameters.Single((arg) => arg.Name == "type"); 

に到着したが、param.GetValueで、パラメータの値にアクセスすると、2つの引数が必要です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) 
    // ... 
} 

答えて

1

あなたがプロパティICollection<IParameter> IContext.Parametersによってパラメータにアクセスすることができます。 context.Parameters.Single(x => x.Name == "type")を使って見つけることができます。

また、サブタイプをParameterに設定するか、強く型付けされた情報を持つカスタムパラメータタイプの場合はIParameterを実装することもできます。p.Ex. ComponentVMTypeParameterを選択し、context.Parameters.OfType<ComponentVMTypeParameter>().Single()を使用して選択します。

別のアプローチ:

  • 使用条件バインディングの代わりにプロバイダの(When(...)構文は、あまりにも、パラメータをチェックすることができます)。プロバイダを拡張する必要はありません。
  • プロバイダーの代わりにfactoryを使用してください。名前のバインディング使用
    • Bind<IFoo>().To<Foo1>().Named("Foo1")
    • IResolutionRoot.Get<IFoo>("Foo1");

をしかし、原則的にIProviderを使用する必要はありません。代わりに

しかし、種類の限られた量があるのなら、私は

+0

代わりに抽象工場を使用して検討したいことができありがとう、私はあなたのソリューションの最初の部分に到着しました。私の編集を見てください。私は最後の部分が必要です。とにかく私はあなたの答えを受け入れています – Sanandrea

+0

'Factory'に関しては、' ViewModels'を 'Kernel.Get ()'でインスタンス化しています。 – Sanandrea

+0

@Sanandrea 'var type =(CommonVMTypes)param.GetValue(context、null);'は大丈夫です。実装では、ターゲットに任意の値を設定する必要はありません。あなたがそれを使う方法は、 'context'でもアクセスされていません。 'Parameter'クラスは非常に汎用的で、多くのユースケースを許しています。 – BatteryBackupUnit

関連する問題