0

階層化されたアーキテクチャを使用する .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));
}

私の質問に

  1. このビジネス層ロジックは「十分」ですか、それとも疎結合、高い結束、およびテスト可能なコードを実現するために何ができるでしょうか?
  2. コンストラクターでクエリするデータ コンテキストを挿入する必要がありますか? QueryHelper 定義は DAL にあることに注意してください。それを使用するコードはBLにあります

わかりやすくするために追加のコードを投稿する必要があるかどうかを教えてください。インターフェイス IQueryHelper で十分かどうかに最も興味があります..

4

1 に答える 1