1

Ninjectを使用して依存関係を注入しています。他の複数のプロパティと一緒にHasBilling、HasPaymentプロパティ - C#Ninjectパラメータベースのバインド

public interface IClass 
{ 
} 

public class Class: IClass 
{ 
public virtual void Method(Object context) 
{ 
    -------- 
} 
} 

public class Class1: IClass 
{ 
public override void Method(Object context) 
{ 
    -------- 
} 
} 

public class Class2: IClass 
{ 
public override void Method(Object context) 
{ 
    -------- 
} 
} 

context

が含まれています は、私は以下のクラス構造を有しています。

Method()は、工場出荷時のパターンを使用して起動されます

public interface IClassFactory 
    { 
     IClass CreateClass(); 
    } 

_classFactory.CreateClass().Method(....) 

ので、パラメータHasBillingtrueに等しいとき、私はClass1実装のMethod()を呼び出す必要があり、HasPaymentがtrueに等しい場合も同様、Class2実装のMethod()でなければなりませんと呼ばれる。

Ninjectはバインディングを使用、私はこれらのバインディングを試してみましたが、どちらも働いた:

Bind<IClass>().To<Class1>().When(x => x.Target.Member.Name.Contains("HasBilling").Equals(true)); 

がこれを試みたが、運は:

Bind<IClass>().To<Class1>().WithMetadata("HasBilling", true); 

いくつかのいずれかでのバインディングは必要なもので私を助けていないことができますしてくださいパラメーター値(HasBilling,HasPayment)に基づいてClass1,Class2メソッド(Method)を呼び出すように設定することができます。事前に

多くのおかげで、

おかげで、 WH

答えて

0

contextはあなたの具体的なクラスや工場にいずれかに合格する必要がありますその後、ロードするために、具体的な種類を決定する必要がある場合。 AFAIKでは、Ninjectがコール・チェーンを調べて「メソッドXが呼び出されるため、その情報を使用して、どの具体的なクラスを使用するかを判断する必要がありません」と言う方法はありません。

あなたの工場を変更する場合は、この問題は非常に簡単な理由:代替プロキシパターンを使用することです

IClassFactory classFactory; // injected 
object context; 

classFactory.CreateClass(context).Method(); 

interface IClassFactory 
{ 
    IClass CreateClass(Object context) 
} 

class ClassFactory : IClassFactory 
{ 
    IClass CreateClass(Object context) 
    { 
     if (context.HasBilling) 
      return new Class1(); 

     // default case 
     return new Class2(); 
    } 
} 

次にあなたが消費することになります。 IClassFactoryで除外してください。IClass代わりに、プロキシを使用:あなたのカーネルで

public class ClassProxy : IClass 
{ 
    void Method(Object context) 
    { 
     if (context.HasBilling) 
      new Class1().Method(context); 
     else 
     //etc 
    } 
} 

として、あなたがこれを配線したい:あなたはまた、あなたの実装は、カーネル内IClassにバインドされていないことを確認する必要があると思います

kernel.Bind<IClass>().To<ClassProxy>(); 

。 (したがって、にはありません。kernel.Bind<IClass>().To<Class1>()があることを確認してください。

あなたの実装クラスのためのDIを利用したい場合は、しかし、あなたは自己バインド可能(kernel.Bind<Class1>().ToSelf())それらを作ることができ、その後、あなたのClassProxyが依存関係としてそれらを取ることができる:

class ClassProxy : IClass 
{ 
    private readonly Class1 _class1;  
    private readonly Class2 _class2; 

    public ClassProxy(Class1 class1, Class2 class2){ 
     _class1 = class1; 
     _class2 = class2; 
    } 

    void Method(object context) 
    { 
     if (context.HasBilling) 
      _class1.Method(context); 
    } 
関連する問題