有人可以帮我理解界面在这里是如何工作的吗?

时间:2013-02-18 01:28:11

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我已经实现了以下代码,但不知道接口是怎么回事。我有两个项目:Project.Web和Project.Core。

在Project.Web中,我有一个Infrastructure命名空间,它实现了一个DataSource接口:

namespace Project.Web.Infrastructure
{
    public class ProjectDataSource : DbContext, IProjectDataSource
    {

        public ProjectDataSource() : base("DefaultConnection") // 1) What is this constructor doing?
        {

        }

        public DbSet<Set> Sets { get; set; }
        public DbSet<Card> Cards { get; set; }


        void IProjectDataSource.Save()   // 2) This method isn't even defined in the interface, what value does it provide?
        {
            SaveChanges();
        }

        IQueryable<Card> IProjectDataSource.Cards // 3) This gets me a list of Cards, but from where?
        {
            get { return Cards; }
        }

        IQueryable<Set> IProjectDataSource.Sets
        {
            get { return Sets; }
        }

    }
}

现在,在Project.Core中我有IProjectDataSource,接口:

namespace Project.Core
{
    public interface IProjectDataSource
    {
        IQueryable<Card> Cards { get; }
        IQueryable<Set> Sets { get; }
        IQueryable<Side> Sides { get; }
        void Save();
    }
}

在Web项目控制器中,我有这样的代码:

namespace Project.Web.Controllers
{
    public class SetController : Controller
    {
        private readonly ProjectDataSource _db;

        public SetController(ProjectDataSource db)
        {
            _db = db;
        }

问题1-3在代码中,我的最后一个问题是4)最后一个代码块究竟发生了什么?为什么有一个SetController的构造函数使代码更少耦合?

任何有明显示例的指针都会有所帮助 - 我一直在努力理解接口,所以我可以开始在我的MVC应用程序中实现一个Service层,但是我有点挣扎。非常感谢。

2 个答案:

答案 0 :(得分:0)

  1. 提供一个无参数构造函数,该构造函数调用基类(DbContext)构造函数,该构造函数接受单个字符串参数,并传递值“DefaultConnection”。 (您似乎使用的是Entity Framework Code First,我相信这会在配置文件中用作连接字符串的名称。)

  2. 我不明白这个问题 - 界面上是否定义了Save方法?

  3. 我相信Entity Framework Code First可以根据惯例在数据库中查询名为“Card”的表格。

  4. 按原样,它不会使代码更少耦合,您需要一个构造函数,它使IProjectDataSource(接口)不是ProjectDataSource(该接口的实现)。然后,您的代码不依赖于该具体实现,因此您可以将其替换为非常容易实现该接口的替代实现。 (如果在应用程序中使用依赖注入库(如Ninject)来满足依赖关系并创建控制器,则更容易实现。)

答案 1 :(得分:0)

关于问题2)和3) - .Save和.Cards在IProjectDataSource(您的自定义数据访问接口)和DbContext(您正在利用的基类)上定义。 它们都是公开的并且具有相同的签名。您希望确保通过IProjectDataSource而不是DbContext访问它们 - 因此是前面的IProjectDataSource。这是对接口进行编程的方法。 该功能来自DbContext,它是“基础”实现。

Jon已经回答了1和4。