2

我会在我的 Web 项目中使用 3 层架构。DAL -> EF 4 包装器,带有经典的 CRUD 方法(AddEntity、RemoveEntity 等) BAL -> 业务逻辑和查询公开(selectByName、byCity、bySomeOtherProperty)。用户界面 - Aspx 页面

我的问题是关于 EF 公开的 navigationProperty。如果我有一个 CustomerRepostiory,aspx 方面我不想允许对不是客户的实体进行操作,假设以下 POCO 类:

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 回答