0

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

在 Project.Web 中,我有一个实现 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 应用程序中实现服务层,但我有点挣扎。非常感谢。

4

2 回答 2

0
  1. 提供调用基类 (DbContext) 构造函数的无参数构造函数,该构造函数采用单个字符串参数,传递值“DefaultConnection”。(您似乎首先使用的是实体框架代码,我相信这是在您的配置文件中用作连接字符串的名称。)

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

  3. 我相信 Entity Framework Code First 会根据约定在数据库中查询名为“Card”的表。

  4. 照原样,它不会使代码耦合度降低,您需要一个构造函数来接受IProjectDataSource(接口)而不是ProjectDataSource(该接口的实现)。然后,您的代码将不依赖于该具体实现,因此您可以将其换成可以轻松实现该接口的替代实现。(如果您在应用程序中使用诸如Ninject之类的依赖注入库来满足依赖关系并创建控制器,这将更容易实现。)

于 2013-02-18T01:37:18.377 回答
0

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

乔恩已经回答了 1 和 4。

于 2013-02-18T07:55:19.300 回答