实体框架 – EF 4.2代码第一和DDD设计问题
尝试使用EF 4.2(或EF 4.1)代码进行DDD开发时,我有几个担忧.我做了一些广泛的研究,但没有为我的具体问题提出具体的答案.这是我的担忧:
>域不能知道持久层,换句话说,域与EF完全分离.但是,为了将数据保存到数据库,每个实体必须附加到EF上下文或添加到EF上下文中.我知道你应该使用工厂来创建聚合根的实例,所以工厂可以用EF上下文注册创建的实体.这似乎违反DDD规则,因为工厂是域的一部分,而不是持久层的一部分.我应该如何创建和注册实体,以便在需要时正确地保留到数据库? 我意识到这些是开放式的设计问题,但是我尽量在使用EF作为持久层的同时,坚持使用DDD设计模式. 提前致谢!
在1:我并不是所有熟悉EF,但使用基于代码优先/约会的映射方法,我认为映射POCO与getter和setter并不是太难(甚至保持“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); } } 现在,关于总体生命周期,主要有两种情况: >创建新聚合:您可以使用工厂,工厂方法,构建器,构造函数,…适合您的需要.当您需要持久化聚合时,查询其状态并持久化(通常此代码不在您的域中,并且非常通用). 2:有几件事情想到了.这里有一个列表: >聚合根是一致性边界.你在组织和员工之间看到什么一致性要求? 3:从外面分配标识符,覆盖,继续.这并不意味着暴露他们(只有在POCO州). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |