2012-04-27 96 views
2

我即將建立一個良好的舊ado.net方式的數據訪問層。傳統上,我會根據簡單的存儲庫模式構建dal。但是這次我想嘗試抽象工廠模式,因爲我最近在一篇文章中已經閱讀了這個模式。實現抽象工廠模式的正確方法?

所以我在這裏嘗試編碼與抽象工廠模式的dal。首先讓我解釋我到目前爲止所得到的結果。之後我想知道的是,我的方法是否是實施這種模式的正確方式,以及存儲庫方法的優點。

所以我寫了下面的類:

public abstract class Db 
{ 
    //this is class will contain methods like: 
    //public abstract IDbConnection CreateConnectionInstance(); 
} 

public class SqlDb : Db 
{ 
    //this is class will contain methods like: 
    //public override IDbConnection CreateConnectionInstance() 
    //{ 
    //  ... return new SqlConnection(); 
    //} 
} 

public class OracleDb : Db 
{ 

} 

public class MockupDb : Db 
{ 

} 

//this class generates the fitting provider but does not have a base (is this correct?) 
public static class DbFactory 
{ 
    public static Db CreateInstance(DbProviderType dbProviderType) 
    { 
     Db db = null; 
     switch (dbProviderType) 
     { 
      case DbProviderType.Oracle: 
       db = new OracleDb(); 
       break; 
      case DbProviderType.Sql: 
       db = new SqlDb(); 
       break; 
      case DbProviderType.Mockup: 
       db = new MockupDb(); 
       break; 
      default: 
       break; 
     } 
     return db; 
    } 
} 

所以我的問題在短期: 1)這是一個正確實施抽象工廠模式的? 2)什麼可以做得更好? 3)從基類繼承的不同的存儲庫類有什麼優勢?

Thx很多傢伙。

如果您需要更多關於我的代碼的信息,請告訴我。但現在沒有更多的時間了!

回答

3

.Net中已經存在抽象數據庫提供程序工廠。它叫DbProviderFactory。您可以通過創建不同的混凝土工廠

var factory = DbProviderFactories.GetFactory("System.Data.OracleClient"); 
DbConnection connection = factory.CreateConnection(); 

爲什麼不使用盒子裏已有的東西?

Here你可以閱讀更多關於DbProviderFactories以及如何添加自定義工廠實現。

0

我想,你混合了一些概念。

存儲庫允許您從存儲性質中抽象出來。這是一個黑匣子,它可以給你一個物體,符合一些標準,然後收回。存儲庫內部可以在多個數據源中獲取或存儲對象(例如,存儲在數據庫中的一些對象數據,另一部分數據 - 在文件中或在外部設備中,這不能用關係數據源來描述)。

工廠使用ADO .NET數據源時可以增加更多的靈活性。但它不是存儲庫的替代品。存儲庫可以使用工廠來獲取特定的數據源實現。

Upd。關於你的代碼示例 - 當提供者類型未知時,工廠應該拋出異常。