[英]Appropriate way to abstract away a Database class/API?
根據政策,我必須使用MS Access,但是由於實體框架不支持它,因此我決定創建自己的類,該類將MS Access特定的代碼抽象化,如下所示:
public class DB
{
public string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
public string fileName = "db.mdb";
public string connectionString;
public OleDbConnection connection = null;
public DB()
{
this.connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; " +
"Data Source=" + this.path + "\\" + this.fileName;
connection = new OleDbConnection(connectionString);
connection.Open();
}
public OleDbDataReader Read(String queryString)
{
OleDbCommand cmd = new OleDbCommand(queryString, connection);
return cmd.ExecuteReader();
}
~DB()
{
if (connection != null)
{
connection.Close();
}
}
}
我有幾個問題:
您的問題與“堆棧溢出”的“太寬泛”有關; 考慮根據您的實際可部署性測試每個更改。 也就是說,我可以提出一些一般性建議:
如果要“抽象” API,請使其與您要抽象的接口匹配。 例如,如果您以Entity Framework為目標,則使您的類返回DbSet<YourClass>
而不是DbSet<YourClass>
的YourClass
實例。 這應該使您無需更改代碼即可切換到EF。
使您的DB
類(可怕的名稱;我建議您使用YourBusinessModel
)繼承DbContext
,實現Dispose
,並使用類似以下的代碼:
using (var bm = new YourBusinessModel(yourDbConnection))
{
bm.YourEntities.Load(predicate);
foreach (var ye in bm.YourEntities)
DoSomethingWith(ye.InterestingProperty);
}
除非您確實需要終結器,否則不要使用它們,而且我認為您不需要它們。
嘗試與Access數據庫建立多個連接確實很危險,除非它們都是只讀的。 如果您甚至有一個並行運行的編寫器,我建議序列化對數據庫的訪問。 如果這太難了,那么使其成為單例可能是一個不錯的第一個版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.