내 프로젝트는 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()
{ }
}
이 문서는 올바른 경로에 있어야합니다. https://github.com/ninject/Ninject/wiki/Contextual-Binding –
https://github.com/ninject/Ninject/wiki/Multi-injection을 확인하십시오. –