Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 域驱动设计:重写域类中的虚拟方法_Entity Framework_Domain Driven Design_Repository Pattern - Fatal编程技术网

Entity framework 域驱动设计:重写域类中的虚拟方法

Entity framework 域驱动设计:重写域类中的虚拟方法,entity-framework,domain-driven-design,repository-pattern,Entity Framework,Domain Driven Design,Repository Pattern,我的应用程序被分解成几个程序集 MyProject.Infrastructure程序集包含所有域对象,如Person和Sale以及接口存储库,如IPersonRepository和IsalRepository 数据程序集包含这些存储库的具体实现 存储库从数据库中提取数据并实例化新的域类。例如,IPersonRepository.GetPersonByNumber(customerNumber)将从数据源读取客户,创建一个新的Person类,填充它并返回给调用者 我现在开始看到向我的域类中添加一些

我的应用程序被分解成几个程序集

MyProject.Infrastructure程序集包含所有域对象,如
Person
Sale
以及接口存储库,如
IPersonRepository
IsalRepository

数据程序集包含这些存储库的具体实现

存储库从数据库中提取数据并实例化新的域类。例如,
IPersonRepository.GetPersonByNumber(customerNumber)
将从数据源读取客户,创建一个新的
Person
类,填充它并返回给调用者

我现在开始看到向我的域类中添加一些方法可能有意义的情况,例如
Person.UpdateAddress(address)

是否可以将此方法作为虚拟方法放在我的
Person
类上,然后在我的数据层中创建派生类,这些派生类覆盖这些方法以提供所需的功能

我想确保我不会违反任何DDD惯例


我知道我也可以选择将这些方法放在存储库中,例如,
IPersonRepository.UpdatePersonAddress(person,address)
person.UpdateAddress应该在您的域中,而不是存储库中。UpdateAddress是逻辑,您应该尽量避免存储库中的逻辑。如果您使用的是实体框架,则不需要“数据类”。

大多数ORM都有更改跟踪器,当您持久化主实体时,这些跟踪器将自动持久化相关实体(前提是您在映射配置中声明了正确的关系),因此您不需要在存储库中使用
UpdatePersonAddress()
。只需在
Person.UpdateAddress(address)
中的对象级别执行您想执行的任何操作,而不必考虑持久性,这里不是执行持久性的地方


不过,您需要的是一个对象,当您认为应该保存这些更改时,该对象将在执行上下文感知代码中调用,以刷新对持久性存储的更改。例如,它可能是包含实体框架DbContext的工作单元。

为什么数据访问类要实现域类?域应该封装数据访问,对使用代码隐藏数据访问。域类将保持裸露,不涉及持久性。数据类将覆盖域类并提供必要的持久性功能。一个简单的方法,比如Person.FirstNamePlusSurname,它使用类的属性执行操作,可以在域类上使用。但是,必须对数据库进行额外查询的某些内容(如Person.UpdateAddress)最好作为Person.UpdatePersonAddress存在于存储库中,因为只有存储库才应该关心数据如何保存/加载到数据库中或从数据库中加载,其中,作为域类,应该只关注自身。
updateAddress
不是一个好的DDD名称。用户移动了吗?然后
user.MovedToNewAddress(address)
。但是如果Person.UpdateAddress执行类似于将新地址记录添加到地址表的操作,那么我怎么可能在持久性不受影响的Domain.Person类上使用该方法。Person将具有address属性,UpdateAddress仅设置Person.address属性。”将新地址记录添加到地址表“=>在DDD中,没有什么比地址表或记录更好的了。只是属性和方法。也许。。最终会出现某种UnitOfWork,它会将您的域更改(Person.Address)刷新到某种数据库中。