2016-09-16 70 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

Hi @Remo。请问你认为你可以看看这个问题吗? http://stackoverflow.com/questions/40198294/how-to-configure-ninject-so-that-it-creates-a-single-instance-per-controller?noredirect=1#comment67673663_40198294 – eddy

相关问题