こんにちは私はXamarin
MVVM
プロジェクトで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つの引数が必要です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)
// ...
}
代わりに抽象工場を使用して検討したいことができありがとう、私はあなたのソリューションの最初の部分に到着しました。私の編集を見てください。私は最後の部分が必要です。とにかく私はあなたの答えを受け入れています – Sanandrea
'Factory'に関しては、' ViewModels'を 'Kernel.Get()'でインスタンス化しています。 –
Sanandrea
@Sanandrea 'var type =(CommonVMTypes)param.GetValue(context、null);'は大丈夫です。実装では、ターゲットに任意の値を設定する必要はありません。あなたがそれを使う方法は、 'context'でもアクセスされていません。 'Parameter'クラスは非常に汎用的で、多くのユースケースを許しています。 – BatteryBackupUnit