這是一個白癡問題,所以你必須原諒我,但我是一個自學成才的程序員,而且乾淨整潔的架構經常讓我感到困惑。我正在通過這樣的問題來學習:)使用接口鬆散地連接NoSQL提供程序
所以我必須編寫一個數據訪問類來與NoSQL數據庫進行交互。問題在於,我們希望在以後更改我們的NoSQL平臺,因此我需要在我的類和實際的數據訪問之間儘可能鬆散地實現這種依賴關係。
草圖繪製了這一點,在我的腦子裏,我想通做到這一點的最好辦法是,將界面有點像這樣:
public interface INoSql
{
string ServerLocation
{
get; set;
}
string DatabaseName
{
get; set;
}
string CollectionName
{
get; set;
}
void SaveChanges(List<NoSqlItem> nsCollection);
}
然後使該是這樣的特定數據訪問類MongoDB的
public class MongoDBConnection : IRealtimeDataAccess
{
string ServerLocation
{
get; set;
}
string DatabaseName
{
get; set;
}
string CollectionName
{
get; set;
}
public void SaveChanges(List<NoSqlItem> nsCollection)
{
MongoServer mServer = MongoServer.Create(this.ServerLocation);
MongoDatabase mDb = mServer.GetDatabase(this.DatabaseName);
MongoCollection<BsonDocument> mDbItemCollection = mDb.GetCollection<BsonDocument>(this.CollectionName);
mDbItemCollection.InsertBatch(nsCollection);
}
簡單到目前爲止 - 所有我需要做的就是使用數據訪問層只引用的接口,然後如果我們想換到另一個NoSQL的供應商所有我需要做的就是重新確保任何類 - 爲實現相同接口的新數據訪問組件編寫代碼 對?好吧,考慮一下,問題出現在我想使用它的時候。因爲這顯然不起作用:
INoSql noSQLConnection = new INoSql;
因爲你不能實例化一個接口。
那麼有什麼解決方案來保持我的代碼漂亮和鬆散?它周圍閱讀看起來好像一個答案是,其注入的構造函數:
public class MyClass
{
private INoSql NoSql;
public myClass(INoSql NoSql)
{
this.NoSql = NoSql;
}
}
這看起來整潔,但不是這只是移動的問題?因爲當你創建MyClass時,你將不得不實例化一個實現INoSql的具體版本,是的,那必須是一個MongoDBConnection--或者其他什麼 - 而不是鬆散耦合的類?
顯然我錯過了什麼,但什麼?還有其他解決這個常見問題的方法嗎?
乾杯, 馬特
感謝你 - 有趣的閱讀。最後,我決定Respository模式對我的需求有點誇張,因爲換出可能永遠不會發生,理想情況下我不想將另一個外部庫添加到我們的代碼中。我用工廠方法獲得了大部分所需的東西。但是,您的答案是有用的,相關的,並使我走上正確的道路,因此值得一試。 –
@MattThrower沒問題。順便說一下,您不需要考慮_repository pattern_「換出」。它是絕對抽象對象源的最佳解決方案之一,因此您可以避免依賴OR/M框架或簡單的ADO.NET,_repository pattern_更加「業務層友好」。但我對您的實際需求一無所知,我希望這些信息能成爲您未來項目的靈感源泉! :) –