在我的WPF應用程序,我做了兩個單獨的項目:在UI(用XAML和的ViewModels)和「核心」(它就是人們所說的「域對象」或「業務對象」 - 在我的用例中代表離散概念的對象)。我明白這是一個很好的做法。業務對象和多個數據源
但我的許多業務對象的多個數據源進行交互。例如,Document
對象可能包含數據庫以及來自文件的數據。
然後,您可以用Document
「執行」的一些事情 - 我在Document
上執行的方法 - 涉及其他資源。例如,Document.SubmitForProcessing()
調用Web服務。
所以我寫了這一點:
public class Document
{
public string Name { get; set; }
public string FilePath { get; set; }
public string FileData { get; set; }
private Document() { }
public static Document GetByID(int documentID, string databaseConnectionString, string baseFilePath)
{
// Using Dapper
Document newDoc = db.Query<Document>("SELECT Name, FilePath FROM Documents WHERE ID = @pID", new { pID = documentID });
newDoc.FileData = File.ReadAllText(Path.Combine(basePath, newDoc.FilePath));
return newDoc;
}
public void SubmitForProcessing(IWebService webService)
{
webService.ExecuteFoo(this.Name, this.FileData);
}
public void DoBusinessStuff()
{
this.FileData = this.FileData.Replace("foo", "bar");
}
}
不用說,這讓超級討厭的真快,它的排序很難寫反對測試。
所以我也讀到了依賴注入和存儲庫模式。但我不確定如何在這種情況下正確地做到這一點。我是否對每個數據源都有單獨的存儲庫類,然後是某種DocumentFactory
或訪問單獨存儲庫並將一個Document對象縫合在一起的東西?還是有更簡單的方法?
我主要關心的是讓代碼測試友好,這樣我就可以編寫一些單元測試而不嘲笑整個數據庫和文件系統,還可以停止向每個工廠方法傳遞整個參數的大雜燴(例如GetByID(int documentID, string databaseConnectionString, string baseFilePath)
- 我的現實生活中有超過6個這樣的參數)。
在類似的問題,答案說好話狀固體,YAGNI,倉庫是CRUD,等我看重這些原則,但我遇到了麻煩,從它們的實用設計。例如,Web服務不是真正的CRUD-y。我是否有一個「存儲庫」,以便在單元測試期間將其切換出來?怎麼樣的文件系統?
TL; DR - 該代碼有什麼問題?
引導讚賞。謝謝!