首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在一个接口的多个实现中使用Ninject & MVC?

如何在一个接口的多个实现中使用Ninject & MVC?
EN

Stack Overflow用户
提问于 2016-09-17 07:34:53
回答 1查看 926关注 0票数 2

我的项目是使用ASP.NET、MVC和Ninject将抽象接口绑定到具体实现,这样我的网站Controllers就可以获取数据。但是,现在我想添加从不同位置获取相同数据集的选项。这将需要我使用的抽象接口的不同实现,但所有方法调用都是相同的。我仍然想继续使用Ninject,但我不想只是复制我已经拥有的接口,并将其命名为不同的名称。

编辑1:我刚刚意识到我从来没有正式问过一个问题。我如何告诉Ninject和/或ASP.NET控制器工厂仅根据查询字符串使用抽象类的一个实现而不是另一个呢?

下面是我正在讨论的一个例子:

代码语言:javascript
运行
复制
// 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>();
    }
}

接口实现:

代码语言:javascript
运行
复制
// 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

代码语言:javascript
运行
复制
// 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()
    { }
}
EN

回答 1

Stack Overflow用户

发布于 2016-10-03 16:49:26

使用工厂扩展(https://github.com/ninject/Ninject.Extensions.Factory/wiki/Factory-interface%3A-Referencing-Named-Bindings)将工厂注入控制器而不是模型。

工厂可用于获取命名实例。创建两个命名绑定,并在控制器中选择适当的绑定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39541413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档