階層化されたアーキテクチャを使用する .net/c#/Entity Framework でアプリケーションを構築しています。外部世界へのアプリケーション インターフェイスは、WCF サービス レイヤーです。この層の下に、BL、共有ライブラリ、および DAL があります。
現在、アプリケーションのビジネス ロジックをテスト可能にするために、テスト中に依存関係を注入できるように、関心の分離、疎結合、および高い結束を導入しようとしています。
以下で説明する私のアプローチで十分かどうか、またはコードをさらに分離する必要があるかどうかについて、いくつかの指針が必要です。
次のコード スニペットは、動的 linq を使用してデータベースにクエリを実行するために使用されます。実行時までクエリするテーブルまたはフィールドの名前がわからないため、動的 linq を使用する必要があります。コードは最初に json パラメーターを型オブジェクトに解析し、次にこれらのパラメーターを使用してクエリを構築し、最後にクエリが実行され、結果が返されます。
以下のテストで使用される GetData 関数を次に示します。
IQueryHelper helper = new QueryHelper(Context.DatabaseContext);
//1. Prepare query
LinqQueryData queryData = helper.PrepareQueryData(filter);
//2. Build query
IQueryable query = helper.BuildQuery(queryData);
//3. Execute query
List<dynamic> dalEntities = helper.ExecuteQuery(query);
DAL のクエリ ヘルパー クラスとそのインターフェイスの高レベルの定義を次に示します。
public interface IQueryHelper
{
LinqQueryData PrepareQueryData(IDataQueryFilter filter);
IQueryable BuildQuery(LinqQueryData queryData);
List<dynamic> ExecuteQuery(IQueryable query);
}
public class QueryHelper : IQueryHelper
{
..
..
}
上記のロジックを使用したテストを次に示します。テスト コンストラクターは、モックされた db を Context.DatabaseContext に挿入します。
[TestMethod]
public void Verify_GetBudgetData()
{
Shared.Poco.User dummyUser = new Shared.Poco.User();
dummyUser.UserName = "dummy";
string groupingsJSON = "[\"1\",\"44\",\"89\"]";
string valueTypeFilterJSON = "{1:1}";
string dimensionFilter = "{2:[\"200\",\"300\"],1:[\"3001\"],44:[\"1\",\"2\"]}";
DataQueryFilter filter = DataFilterHelper.GetDataQueryFilterByJSONData(
new FilterDataJSON()
{
DimensionFilter = dimensionFilter,
IsReference = false,
Groupings = groupingsJSON,
ValueType = valueTypeFilterJSON
}, dummyUser);
FlatBudgetData data = DataAggregation.GetData(dummyUser, filter);
Assert.AreEqual(2, data.Data.Count);
//min value for january and february
Assert.AreEqual(50, Convert.ToDecimal(data.Data.Count > 0 ? data.Data[0].AggregatedValue : -1));
}
私の質問に
- このビジネス層ロジックは「十分」ですか、それとも疎結合、高い結束、およびテスト可能なコードを実現するために何ができるでしょうか?
- コンストラクターでクエリするデータ コンテキストを挿入する必要がありますか? QueryHelper 定義は DAL にあることに注意してください。それを使用するコードはBLにあります
わかりやすくするために追加のコードを投稿する必要があるかどうかを教えてください。インターフェイス IQueryHelper で十分かどうかに最も興味があります..