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()이 공장 패턴을 사용하여 호출 : 매개 변수 HasBillingtrue에 같을 때

public interface IClassFactory 
    { 
     IClass CreateClass(); 
    } 

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

그럼 내가 HasPayment true로 동일 유사 경우, Class1 구현의 Method()를 호출해야 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가 호출 될 것이라는 말을하기 위해 호출 체인을 검사 할 수있는 방법이 없으므로이 정보를 사용하여 사용할 구체적인 클래스를 결정해야합니다."

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 classFactory; // injected 
object context; 

classFactory.CreateClass(context).Method(); 

대안은 프록시 패턴을 사용하는 것입니다

당신이 당신의 공장, 매우 간단하기 때문에이 문제를 변경하는 경우

. 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); 
    }