2

ASP.NET MVC 컨트롤러의 동작 메소드에 의존성을 삽입하고 있습니다.종속성 주입을 콘딧으로 주입

시나리오 : ASP.NET MVC 컨트롤러의 동작 메서드에서 인터페이스를 사용하고 싶습니다. 이 인터페이스는 2 개의 클래스에 의해 구현됩니다. 예를 들어 modelA와 modelB는 모두 interfaceA을 구현합니다. 런타임에 사용자가 드롭 다운 종속성 값에 따라 드롭 다운의 값을 변경하면 injection이 modelA 또는 modelB를 삽입해야하는지 결정해야합니다.

또한 DI가 유일한 솔루션인지 또는 다른 솔루션이 있는지 확실하지 않습니다. 아니면 공장에서 잘 모르겠다.

+0

이것은 의존성 주입에 적합하지 않습니다. 드롭 다운 결과를 DI 컨테이너와 연결하는 쉬운 방법은 없습니다. 둘 다 주입하고 라우트 또는 URL 매개 변수에 따라 클래스를 선택하도록하십시오. –

+0

감사합니다. 작동한다고 생각합니다. 나는 시도 할 것이다. 많은 작업 방법으로 작성하는 대신 일반 로그인 어딘가에 넣을 수 있습니까? 또한 ModelA와 ModelB를 언급하는 것을 잊어 버리는 것은 다른 어셈블리에 있습니다. 드롭 다운 값 1 내가 modelA의 인스턴스를 만들어야하는 경우를 가정하십시오. ModelB Like Public ActionResule MehtodName (InterfaceA inter) { // 경로 값을 사용해야합니까 ?? } –

+0

DI 컨테이너에 등록하고 컨트롤러 클래스에 삽입 할 수 있습니다 (예 : 'MyController (ModelA, ModelB b)'클래스를 호출 한 다음'private readonly' 필드에 저장하면 각 액션 메소드가이를 사용할 수 있습니다. 또는 공용 인터페이스가있는 경우 IEnumerable 을 삽입 한 다음 모델 자체의 일부 메타 데이터를 기반으로 사용할 IE를 선택할 수 있습니다. –

답변

0

당신은 공장 패턴을 사용할 수 있습니다 는

public interface InterfaceAFactory 
{ 
    InterfaceA Create(int dropDownValue); 
} 

public class AFactory : InterfaceAFactory 
{ 
    private readonly IContainer _container; 
    public AFactory(IContainer container) 
    { 
     _container = container; 
    } 

    public InterfaceA Create(int dropDownValue) 
    { 
     if(dropDownValue > 0) 
      return _container.GetInstance<ModelA>(); 

     _container.GetInstance<ModelB>(); 
    } 
} 

(또는 단순히 대신 컨테이너의 필요한 의존성을 주입) 다음 단순히

private readonly InterfaceAFactory _interfaceAFactory; 

public MvcController(InterfaceAFactory interfaceAFactory) 
{ 
    _interfaceAFactory = interfaceAFactory; 
} 

public void DropDownValueChanged(int dropDownValue) 
{ 
    var model = _interfaceAFactory.Create(dropDownValue); 
} 

을 내가 StructureMap하지만 당신을 사용했습니다 이것을 AutoFac (인스턴스 등록, 컨테이너 주입 및 인스턴스 해결)에 적용 할 수 있습니다.

+0

컨트롤러에 ActionMethod 예제가 있습니까? 생성자가 아닌 모델을 incomming에 의존하고 있습니다. 처럼 Public ActionResult ActionName (IMyModelInterface obj) –