Ale*_*son 13 design-patterns domain-driven-design entity-framework ef-code-first
尝试首先使用EF 4.2(或EF 4.1)代码进行DDD开发时,我有几个问题.我做了一些广泛的研究,但没有为我的具体问题提出具体的答案.以下是我的担忧:
域无法了解持久层,或者换句话说,域与EF完全分离.但是,要将数据持久保存到数据库,必须将每个实体附加到EF上下文或添加到EF上下文.我知道你应该使用工厂来创建聚合根的实例,这样工厂就可以用EF上下文注册创建的实体.这似乎违反了DDD规则,因为工厂是域的一部分而不是持久层的一部分.我应该如何创建和注册实体,以便在需要时正确地持久保存到数据库?
聚合实体是否应该创建它的子实体?我的意思是,如果我有一个Organization并且Organization有一个Employee实体集合,应该Organization有一个方法,如CreateEmployee或AddEmployee?如果不是创建Employee实体的地方,请记住Organization聚合根'拥有'每个Employee实体.
首先使用EF代码时,每个实体的ID(以数据库中的标识列的形式)将自动处理,通常不会被用户代码更改.由于DDD声明域与持久性无知是分开的,因此在域中公开ID似乎很奇怪,因为这意味着域应该处理为新创建的实体分配唯一ID.我应该关注暴露实体的ID属性吗?
我意识到这些是一些开放式的设计问题,但我正在努力坚持DDD设计模式,同时使用EF作为我的持久层.
提前致谢!
Yve*_*out 24
1:我不是那么熟悉EF,但使用基于代码优先/基于约定的映射方法,我认为用吸气剂和设定器映射POCO并不太难(甚至将" DbContext与DbSet属性"类保持在另一个项目不应该那么难).我不认为POCO是聚合根.相反,它们代表"你希望坚持的聚合中的状态".以下示例:
// This is what gets persisted
public class TrainStationState {
public Guid Id { get; set; }
public string FullName { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
// ... more state here
}
// This is what you work with
public class TrainStation : IExpose<TrainStationState> {
TrainStationState _state;
public TrainStation(TrainStationState state) {
_state = state;
//You can also copy into member variables
//the state that's required to make this
//object work (think memento pattern).
//Alternatively you could have a parameter-less
//constructor and an explicit method
//to restore/install state.
}
TrainStationState IExpose.GetState() {
return _state;
//Again, nothing stopping you from
//assembling this "state object"
//manually.
}
public void IncludeInRoute(TrainRoute route) {
route.AddStation(_state.Id, _state.Latitude, _state.Longitude);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,关于聚合生命周期,有两个主要方案:
2:我想到了几件事.这是一个清单:
在3:从外部分配标识符,克服它,继续前进.但这并不意味着暴露他们(仅在州POCO).
| 归档时间: |
|
| 查看次数: |
3552 次 |
| 最近记录: |