我最近出于无知和缺乏时间,将几个项目中的域模型(POCO实体类)合并到一个'DataModel'项目中,因为我不想在所有项目上复制专用的DbContexts。令我感到理想的是可以完成泛型,比如DbContext扩展,可以从各种客户端项目中添加DbSet实例。
我已经阅读过这类内容,通常与作者相同的圈子中提到 - 并且我全心全意地同意 - DbSet类完全实现了存储库功能。
任何人都可以提供任何关于构建可以存在于一个项目中的通用DbContext的建议,其中其他项目都可以使用共享DbContext注册其域模型(域实体集),在这些模型中,它们都被分配为拥有DbSet充当他们的存储库?
答案 0 :(得分:0)
构建一个通用的DbContext,它可以存在于一个项目中,其他项目都可以注册其域模型(域实体集)
有趣的想法,但我不确定你会从中获得什么。
首先,你永远不能简单地输入db.Customer
(或类似的)。它应始终为genericdb.Set<Customer>()
,不知道 genericdb
是否完全了解Customer
。 (它可能尚未注册)。
然后,如何进行注册?有两种方法可以让上下文将类映射到数据库模型:
DbSet
派生类中创建DbContext
属性,并依赖于有关表名和列名,复数化等的代码优先默认约定。第一个选项违背了通用上下文类的目的,因此您必须通过为域中的每个类提供EntityTypeConfiguration<T>
来注册域类,也适用于类通常可以没有。 (顺便说一句,这应该在上下文的构造函数中完成。)
进一步暗示在某个地方你需要一个组件/服务,它知道哪些类属于哪一组,并且能够提供一致的配置列表。因此,除了将专用上下文作为组织原则开箱即用之外,您还必须创建自己的组织者。
但回到开始。难道你不能创建一个包含DbContext工厂的DAL,该工厂提供以前存在于项目中的上下文吗?您不必以这种方式复制专用的DbContext类。