2016-09-16 9 views
2

내 프로젝트는 ASP.NET MVC와 Ninject을 사용하여 추상적 인 인터페이스를 구체적인 구현에 바인딩하여 웹 사이트 Controllers에서 데이터를 가져올 수 있습니다. 그러나 이제 다른 위치에서 동일한 데이터 집합을 가져 오는 옵션을 추가하려고합니다. 이것은 내가 사용하는 추상 인터페이스의 다른 구현을 요구할 것이다. 그러나 모든 메소드 호출은 동일하다. 여전히 Ninject를 계속 사용하고 싶지만 이미 가지고있는 인터페이스를 복사하고 다른 이름을 지정하고 싶지는 않습니다.Ninject & MVC를 단일 인터페이스의 여러 구현과 함께 사용하는 방법은 무엇입니까?

편집 1 : 나는 공식적으로 질문 한 적이 결코 없다는 것을 깨달았습니다. Ninject 및/또는 ASP.NET 컨트롤러 팩터 리에서 쿼리 문자열에만 기반한 추상 클래스 구현을 사용하는 방법은 무엇입니까?

// Global.asax.cs 

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     // Using Ninject resolver 
     NinjectResolver.SetResolver(new NinjectResolver()); 
    } 
} 

// NinjectResolver.cs 

public class NinjectResolver : IDependencyResolver 
{ 
    private IKernel kernel; 

    public NinjectResolver() 
    { 
     kernel = new StandardKernel(); 
     AddBindings(); 
    } 

    public void AddBindings() 
    { 
     // I don't know what to do here: 

     //kernel.Bind<IFooModel>().To<FooModelImplementation>(); 
     //kernel.Bind<IFooModel>().To<FooModelImplementation2>(); 
    } 
} 

인터페이스 구현 :

// FooModel.cs 

public interface IFooModel 
{ 
    FooData GetData(int dataID); 
} 

public class FooData 
{ 
    public string Field1 {get; set;} 
    public string Field2 {get; set;} 
    public string Field3 {get; set;} 
    // ... 
    public FooData() 
    { } 
} 

public class FooModelImplementation : IFooModel 
{ 
    public FooModelImplementation() 
    { } 

    public FooData GetData(int dataID) 
    { 
     // Get data... 
    } 
} 

public class FooModelImplementation2 : IFooModel 
{ 
    public FooModelImplementation2() 
    { } 

    public FooData GetData(int dataID) 
    { 
     // Get data from source 2... 
    } 
} 

그리고 내 Controller :

// FooController.cs 

public FooController : BaseController 
{ 
    private IFooModel mFooModel; 

    public FooController(IFooModel fooModel) 
    { 
     mFooModel = fooModel; 
    } 

    // http://www.example.com/Foo?dataID=1&location=2 
    public ViewResult FooView(int dataID) 
    { 
     // Here I want the mFooModel to be an instance of FooModelImplementation2 
     // because "location" is 2. How do I do this? 
     FooData data = mFooModel.GetData(dataID); 
     FooViewModel viewModel = new FooViewModel 
     { 
      Field1 = data.Field1; 
      Field2 = data.Field2; 
     }; 
     return View(viewModel); 
    } 
} 

public class FooViewModel 
{ 
    public string Field1 {get; set;} 
    public string Field2 {get; set;} 

    public FooViewModel() 
    { } 
} 
+2

이 문서는 올바른 경로에 있어야합니다. https://github.com/ninject/Ninject/wiki/Contextual-Binding –

+0

https://github.com/ninject/Ninject/wiki/Multi-injection을 확인하십시오. –

답변

1

사용하여 공장 확장 (https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface%3A-Referencing-Named-Bindings 다음

내가 무슨 말을하는지의 예)를 사용하여 모델 대신 컨트롤러에 팩토리를 삽입하십시오.

명명 된 인스턴스를 가져 오는 데 팩터 리를 사용할 수 있습니다. 두 개의 명명 된 바인딩을 만들고 컨트롤러에서 적절한 바인딩을 선택하십시오.

+0

안녕하세요 @Remo. 이 질문을 한 번보세요. http://stackoverflow.com/questions/40198294/how-to-configure-ninject-so-that-it-creates-a-single-instance-per-controller?noredirect=1#comment67673663_40198294 – eddy