如何处理多层 1 对多关系的 DAL?
How to handle DAL for multiple layers of 1 to many relationship?
我有以下问题:
我有一个具有多层一对多关系的聚合根。
Root -> has many
Child -> has many
GrandChild
我有 Controller
\s 处理在聚合根的每一层上完成的逻辑。
我不知道如何处理数据访问层。
我应该只为聚合根创建一个存储库并通过它处理所有 Child
和 GrandChild
操作,还是为每个级别创建一个存储库就可以了?
此外,在我的案例中 GrandChildren
实体占据了很多 space(它们包含文本),因此我将使用文档数据库 - RavenDB
.
public class Root
{
public int ID{get;set;}
public IEnumerable<Child>Children;
}
public class Child
{
public int ChildID{get;set;}
public IEnumerable<Child>GrandChildren; //occupy a loot of space !
}
public class GrandChild
{
public int GrandChildID{get;set;}
}
public interface IGenericRepository<T>
{
bool Add<T>(T newValue);
T Get<T>(int id);
IEnumerable<T> GetAll();
bool Delete(int id);
bool Update<T>(T value);
}
控制器
public class ParentController
{
IGenericRepository<Root> repo;
public IActionResult<Root> Get(int rootId)
{
return this.repo.Get(rootId);
}
}
public class ChildControiller_V1
{
IGenericRepository<Child>repo;
public IActionResult<Child> Get(int childid)
{
this.repo.Get(childid); //the id is unique
}
}
通过root访问
public class RootRepository:IGenericRepository<Root>
{
/// implementations
public IGenericRepository<Child> GetChildRepository()
{
return //some implementation of IGenericRepository for Child
}
}
public class ChildController_V2
{
IGenericRepository<Root>repo;
public IActionResult<Child> Get(int rootId,int childid)
{
var root=this.repo.Get(rootId);
var childRepo=root.GetChildRepository();
var get= childRepo.Get(childId);
}
}
我希望你得到 idea.For 更多层 我会一直这样做 down.What 考虑到最低实体占据了很多 space 与其他人?
更新
Root
将必须支持 Create
、Delete
- 这里没有发生太多事情
Child
将不得不支持Create
,Delete
- (重点放在GET
, 像这里的 GET 5 children starting from index=10
)
Grandchildren
将不得不支持完整的 CRUD
并在 Update
上进行繁重的工作。它们的 table 大小 GrandChildren
将是 >>>>> 所有others combined.Every Grandchild
将有一个纯文本列。
当我说 table
或 column
时,我指的是它们在典型的 SQL 数据库中的等价物
从(经典)DDD 的角度来看,存储库 return 完全物化聚合,其中聚合表示 consistency/transactional 边界。拥有子代和孙代存储库意味着您放弃了它,并因此获得了 DDD 的一大好处。话虽如此,您需要确定一致性边界在哪里。实体之间是否存在约束?如果没有,它们可以有自己的聚合体。请记住,聚合不会出现在其他聚合中,来自实体的引用应该只转到聚合根,而不是另一个聚合层次结构中的其他实体。
我在这里的回答中已经提到了其他一些可能有趣的点,特别是如果数据太多的方向。
最后,我会说 Raven 有版本 (etags)。如果您最终更新了许多子项,请使用它们。
我有以下问题: 我有一个具有多层一对多关系的聚合根。
Root -> has many
Child -> has many
GrandChild
我有 Controller
\s 处理在聚合根的每一层上完成的逻辑。
我不知道如何处理数据访问层。
我应该只为聚合根创建一个存储库并通过它处理所有 Child
和 GrandChild
操作,还是为每个级别创建一个存储库就可以了?
此外,在我的案例中 GrandChildren
实体占据了很多 space(它们包含文本),因此我将使用文档数据库 - RavenDB
.
public class Root
{
public int ID{get;set;}
public IEnumerable<Child>Children;
}
public class Child
{
public int ChildID{get;set;}
public IEnumerable<Child>GrandChildren; //occupy a loot of space !
}
public class GrandChild
{
public int GrandChildID{get;set;}
}
public interface IGenericRepository<T>
{
bool Add<T>(T newValue);
T Get<T>(int id);
IEnumerable<T> GetAll();
bool Delete(int id);
bool Update<T>(T value);
}
控制器
public class ParentController
{
IGenericRepository<Root> repo;
public IActionResult<Root> Get(int rootId)
{
return this.repo.Get(rootId);
}
}
public class ChildControiller_V1
{
IGenericRepository<Child>repo;
public IActionResult<Child> Get(int childid)
{
this.repo.Get(childid); //the id is unique
}
}
通过root访问
public class RootRepository:IGenericRepository<Root>
{
/// implementations
public IGenericRepository<Child> GetChildRepository()
{
return //some implementation of IGenericRepository for Child
}
}
public class ChildController_V2
{
IGenericRepository<Root>repo;
public IActionResult<Child> Get(int rootId,int childid)
{
var root=this.repo.Get(rootId);
var childRepo=root.GetChildRepository();
var get= childRepo.Get(childId);
}
}
我希望你得到 idea.For 更多层 我会一直这样做 down.What 考虑到最低实体占据了很多 space 与其他人?
更新
Root
将必须支持 Create
、Delete
- 这里没有发生太多事情
Child
将不得不支持Create
,Delete
- (重点放在GET
, 像这里的 GET 5 children starting from index=10
)
Grandchildren
将不得不支持完整的 CRUD
并在 Update
上进行繁重的工作。它们的 table 大小 GrandChildren
将是 >>>>> 所有others combined.Every Grandchild
将有一个纯文本列。
当我说 table
或 column
时,我指的是它们在典型的 SQL 数据库中的等价物
从(经典)DDD 的角度来看,存储库 return 完全物化聚合,其中聚合表示 consistency/transactional 边界。拥有子代和孙代存储库意味着您放弃了它,并因此获得了 DDD 的一大好处。话虽如此,您需要确定一致性边界在哪里。实体之间是否存在约束?如果没有,它们可以有自己的聚合体。请记住,聚合不会出现在其他聚合中,来自实体的引用应该只转到聚合根,而不是另一个聚合层次结构中的其他实体。
我在这里的回答中已经提到了其他一些可能有趣的点,特别是如果数据太多的方向。
最后,我会说 Raven 有版本 (etags)。如果您最终更新了许多子项,请使用它们。