2013-02-18 50 views
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 ar在代码中,我的最后一个问题是4)最后一块代码究竟发生了什么?为什么具有SetController的构造函数会使代码更少耦合?

任何具有明确示例的指针都会有所帮助 - 我一直在努力地理解接口,所以我可以开始在我的MVC应用程序中实现服务层,但我挣扎了一下。非常感谢。

回答

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

  2. 我不明白这个问题 - Save方法在接口上定义?

  3. 我相信实体框架代码首先根据约定在数据库中查询名为“Card”的表。

  4. 由于是,它不会使代码少加上,你需要一个构造函数IProjectDataSource(接口)不ProjectDataSource(该接口的实现)。然后你的代码不会依赖于具体的实现,所以你可以将它换出来,以实现一个可以轻松实现该接口的替代实现。 (如果你使用依赖注入库如Ninject在你的应用程序来满足相关性和创造控制器,这更容易实现。)

0

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

Jon已经回答了1.和4.

相关问题