2013-02-18 119 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.

相關問題