我有一个由EntityFramework持久化的域模型。在任何给定的实体/ POCO中,我希望能够填充(通过EF CodeFirst),然后阅读集合,但只允许通过单独的域服务类对这些集合进行修改。保护EntityFramework集合不被修改
作为一个例子,我可以具有类如:
public class Foo {
public Foo() {
_bars = new List<Bar>();
}
private ICollection<Bar> _bars;
public virtual ICollection<Bar> Bars { get { return _bars; } protected set { _bars = value; } }
}
这将停止与myFoo.Bars = new List<Bar>());
被覆盖的集合。但是,它仍然允许任何使用POCO的人编写代码,例如myFoo.Bars.Add(new Bar());
或类似的代码。
我想让Bars
集合为只读,因此不仅可以直接停止集合,还可以阻止用户直接向集合添加Bar
实例。
这是因为用户被迫使用域服务类将项目添加到集合。该类还将对添加的Bar
实例执行非平凡的验证和业务逻辑检查。例如:
public class AddBarToFooService() : IAddBarToFooService {
public AddBarToFooService(IBarChecker checker) {
_checker = checker;
}
private readonly IBarChecker _checker;
public Add(Foo foo, Bar bar) {
if(_checker.Check(foo, bar) { // Trivial validation check
foo.Bars.Add(foo);
}
}
}
有两个要点:
- 的只读限制需要能够允许域名服务操作集合
- 该解决方案必须符合的EntityFramework 兼容
- 理想情况下,POCO和域名服务应该是松散耦合的
我该如何做到这一点?
因此,您的服务从不暴露上下文?用户是否调用您的代码来保存更改,或者他们能否直接调用SaveChanges? –