我在我的网络项目中使用3层架构。 DAL - >使用经典CRUD方法的EF 4包装器(AddEntity,RemoveEntity adn等) BAL - >业务逻辑和查询公开(selectByName,byCity,bySomeOtherProperty)。 UI - Aspx页面
我的问题是关于EF公开的navigationProperty。如果我有一个CustomerRepostiory,aspx方面我不希望允许对不是Customer的实体进行操作,假设以下是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类包装器才能“隐藏”某些属性? 哪种方法最好?
答案 0 :(得分: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
,这将更清洁,更容易维护
检查此问题
答案 1 :(得分:1)
为Customer编写子类,覆盖Orders,让getter执行您想要的任何访问权限