我有一個由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? –