2012-12-20 41 views
0

我們正在重構ASP.Net Web應用程序的整個代碼庫。幾乎整個應用程序都使用來自c#代碼的sql語句來查詢數據庫,並且類似的sql語句分散在整個代碼庫中。該應用程序使用Mimer數據庫,這不是一個常用的數據庫。ASP.Net爲較少的已知數據庫設計數據訪問層

對於這樣的應用程序,特別是對於數據訪問層,可能是一個好的重構計劃,以便刪除重複的代碼以確保DRY?

回答

0

在數據庫實現上實現一個抽象層,以便您的應用程序調用諸如GetUser()UpdateWidget()而不是IDbCommand.ExecuteReader()和朋友的方法。

這些方法將存在於接口上,每個實體類型一個。

IUserRepository 
IWidgetRepository 

對於每個數據庫平臺,每個接口應該有一個實現者。

MySqlUserRepository 
MySqlWidgetRepository 

MimerUserRepository 
MimerWidgetRepository 

然後創建一個工廠類,它爲相關數據庫平臺提供所請求實體類型的正確實現類的實例。

工廠類應該在知道應用程序當前配置爲使用哪個數據庫平臺的情況下實例化。它應該使用這些信息來選擇要求實例化和返回的類。

class RepoFactory 
{ 
    string _platform; 
    public RepoFactory(string platform) { this._platform = platform; } 

    public IUserRepository GetUserRepository() 
    { 
     if (_platform == "mysql") return new MySqlUserRepository(); 
     if (_platform == "mimer") return new MimerUserRepository(); 
     throw new NotSupportedException(_platform); 
    } 

    public IWidgetRepository GetWidgetRepository() // ... 
} 

保留對RepoFactory單個實例的引用,以便您只需從配置中設置一次即可。

堅持實施者類中的所有數據庫平臺特定的東西,完成任務。 (您有Mimer已經寫好的所有查詢 - 您只需將它們從您的應用程序移植到此新數據層即可。)