2

Web プロジェクトで 3 層アーキテクチャを使用します。DAL -> 従来の CRUD メソッド (AddEntity、RemoveEntity など) を使用した EF 4 ラッパー BAL -> ビジネス ロジックとクエリの公開 (selectByName、byCity、bySomeOtherProperty)。UI - Aspx ページ

私の問題は、EF によって公開されたナビゲーション プロパティに関するものです。CustomerRepostiory がある場合、aspx 側では、次の POCO クラスを想定して、Customer ではないエンティティに対する操作を許可したくありません。

public class Customer
{
    public int Id {get; set;}
public string Name {get; set;}
public ICollection<Orders> Order{get;set;}
}

aspx では次のように実行します。

var customer = bll.getCustomerByName("alex");
customer.Order.Add(new ..) // BAD, I don't want allow it

私は何をすべきか?一部のプロパティを「非表示」にするために、poco クラス ラッパーを作成する必要があるのでしょうか。本当に最善のアプローチはどれですか?

4

2 に答える 2

2

代わりにコレクションを公開しますIEnumerable。そのようにして、コレクションは読み取り専用になります

あなたは次のようなことをしなければならないでしょう:

class Customer
{
   private List<Order> orders();
   Customer()
   {
      this.orders = new List<Order>();
   }

   public IEnumerable<Order> Orders { get { return this.orders.AsEnumerable(); } }

   // you will need a public method to mutate the collection

   public void AddOrder(Order order)
   {
      // implement custom logic, fire domain events, etc
      this.orders.Add(order);
   }
}

編集:

エンティティを変更できない場合 (私には奇妙に思えます...)、ObservableCollection<>

こんななこと

class MyCustomer : Customer
{
   private ObservableCollection<Order> orders;
   internal bool AllowMutateCollection;
   public MyCustomer()
   {
      this.Orders = this.orders = new ObservableCollection<string>();
      this.orders.CollectionChanged += (_, __) =>
      {
          if(!this.AllowMutateCollection)
          {
             throw new NotImplementedException();
          }
      };
   }
}

ここでAllowMutateCollection、エンティティの変異をいつ許可するかを設定する必要がありますが、これは本当に面倒で、おそらくこれがバグの原因になるでしょう...お勧めしません

ただし、デザインを少し再定義し、クラスをラップしてIEnumerable代わりに公開することを強くお勧めします。これにより、クリーンで維持しやすくなります。

この質問をチェック

コレクションが変更されたときにイベントを発生させる (追加または削除)

于 2012-06-02T19:16:48.260 に答える
1

Customer のサブクラスを作成し、Orders をオーバーライドし、必要なアクセス権チェックを getter に実行させます。

于 2012-06-02T19:24:33.700 に答える