私の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オブジェクトをつなぎ合わせるものはありますか?それとも簡単な方法がありますか?
私の主な関心事は、テスト容易なコードを作成して、データベースとファイルシステム全体を模擬しないで単体テストを書くことができるだけでなく、私が持っているすべてのファクトリメソッドにパラメータのsmorgasbordを渡すのを止めることです(例えば、GetByID(int documentID, string databaseConnectionString, string baseFilePath)
- 私の実際の人生は、このような半ダース以上のパラメータを持っています)。
SOLID、YAGNI、リポジトリはCRUDなどの回答がありますが、私はこれらの原則を大切にしていますが、実用的なデザインを得られません。たとえば、Webサービスは実際にはCRUD-yではありません。私は単体テスト中に切り替えることができるように "リポジトリ"を持っていますか?ファイルシステムはどうですか?
TL; DR - このコードで何が問題になっていますか?
ガイダンスが高く評価されました。ありがとうございました!