1

エンティティ フレームワーク (DBContext で生成された DAL クラスですが、この質問には関係ありません) の上に配置する BLL コードをいくつか書いています。これが私のルーチンの1つです:

public static Customer Get(int32 CustID, IEnumerable<string> IncludeEntities = null)
{
}

したがって、それを呼び出すときに、「Orders」や「OrderDetails」など、含めたいエンティティのオプション リストである CustID を渡します。

Customer customer = CustomerBLLRepository.Get("ALFKI", 
     new[] { "Orders", "Orders.Order_Details"});

正常に動作しますが、文字列のリストまたは配列で呼び出すのは好きではありません。IDE が支援できるように、強力な型付けを取得したいと考えています。

次のように宣言することで、型のリストを受け取ることができます。

public static void GetTest(Int32 CustID, params Type[] IncludeEntities)
{
}

インクルードが機能するようにクラス名を文字列として取得しますが、呼び出し元は次のように typeofs を使用する必要があります。

CustomerRepository.GetTest(123, typeof(Order), typeof(OrderDetails));

これは世界の終わりではありませんが、OrderDetails は実際には Orders のナビゲーション プロパティであり、インクルードは Orders.OrderDetails と呼ばれる必要があり、どのエンティティ OrderDetails を見つけるためにコードを突っ込む必要があるため、これは問題を引き起こしますの子であり、文字列を生成します。

私が本当に欲しいのは、EFがインクルードとして望んでいるのと同じ形式でインクルードとして渡すエンティティの厳密に型指定されたリストですが、私はSOLだと思います。

4

2 に答える 2

1

EF モデルでリレーションシップが維持されていると仮定すると、Lambda を使用するカスタム Get ルーチンを使用しないでください。サンプルに基づいて、「顧客」が返されます。

public class RepositoryCustomer: RepositoryBase<Customer> 
...
...
public class RepositoryEntityBase<T>
   public virtual T Get(Expression<Func<T, bool>> predicate)
       return Context.Set<T>.Where(predicate).FirstOrDefault();

コンテキストの任意のセットに対して Generic Get ルーチンを呼び出します。

var aCustomer = RepositoryCustomer.Get(c=>c.id=="ALFKI" && c.Orders.OrderDetail=="bla")

仮想ナビゲーション プロパティは非常に便利で柔軟です。

于 2012-12-17T07:11:40.520 に答える
0

クエリに含めるエンティティを決定することは、BLL 以外のタスクではありません。BLL がデータ ストアの構造を参照する 1 つまたは複数のプロパティを受け取る場合、BLL がデータ ストアの内部構造について知る必要があるすべての呼び出しを示しています。編集:十分に明確ではありません。これを行うのは明らかに間違っています。

IMO では、ユース ケースごとに個別のメソッドを作成する必要があります。そうしないと、BLL は DAL の単なるヘルパー メソッドであり、関心の分離に対する責任はありません。

これは Entity Framework の大きな問題です。MS では、クエリを好きな時点でまとめて、好きな場所でエンティティを使用および維持する必要があるように見えます。実際に光を見ることを非常に困難にします。

于 2012-12-17T07:30:01.587 に答える