gpt4 book ai didi

.net - 存储库模式以及域模型和 Entity Framework 之间的映射

转载 作者:行者123 更新时间:2023-12-03 07:05:21 25 4
gpt4 key购买 nike

我的存储库处理丰富的域模型并为其提供持久性。我不想将贫乏的 Entity Framework 数据实体暴露给我的业务层,因此我需要某种在它们之间进行映射的方法。

在大多数情况下,从数据实体构造域模型实例需要使用参数化构造函数和方法(因为它很丰富)。它不像属性/字段匹配那么简单。 AutoMapper 可用于相反的情况(映射到数据实体),但不能用于创建域模型。

下面是我的存储库模式的核心。

EntityFrameworkRepository类适用于两种泛型类型:

  • TDomainModel :丰富的领域模型
  • TEntityModel : Entity Framework 数据实体

定义了两个抽象方法:

  • ToDataEntity(TDomainModel) :转换为数据实体(对于 Add()Update() 方法)
  • ToDomainModel(TEntityModel) :构建域模型(对于 Find() 方法)。

这些方法的具体实现将定义相关存储库所需的映射。

public interface IRepository<T> where T : DomainModel
{
T Find(int id);
void Add(T item);
void Update(T item);
}

public abstract class EntityFrameworkRepository<TDomainModel, TEntityModel> : IRepository<TDomainModel>
where TDomainModel : DomainModel
where TEntityModel : EntityModel
{
public EntityFrameworkRepository(IUnitOfWork unitOfWork)
{
// ...
}

public virtual TDomainModel Find(int id)
{
var entity = context.Set<TEntityModel>().Find(id);

return ToDomainModel(entity);
}

public virtual void Add(TDomainModel item)
{
context.Set<TEntityModel>().Add(ToDataEntity(item));
}

public virtual void Update(TDomainModel item)
{
var entity = ToDataEntity(item);

DbEntityEntry dbEntityEntry = context.Entry<TEntityModel>(entity);

if (dbEntityEntry.State == EntityState.Detached)
{
context.Set<TEntityModel>().Attach(entity);

dbEntityEntry.State = EntityState.Modified;
}
}

protected abstract TEntityModel ToDataEntity(TDomainModel domainModel);
protected abstract TDomainModel ToDomainModel(TEntityModel dataEntity);
}

以下是存储库实现的基本示例:

public interface ICompanyRepository : IRepository<Company>
{
// Any specific methods could be included here
}

public class CompanyRepository : EntityFrameworkRepository<Company, CompanyTableEntity>, ICompanyRepository
{
protected CompanyTableEntity ToDataEntity(Company domainModel)
{
return new CompanyTable()
{
Name = domainModel.Name,
City = domainModel.City
IsActive = domainModel.IsActive
};
}

protected Company ToDomainModel(CompanyTableEntity dataEntity)
{
return new Company(dataEntity.Name, dataEntity.IsActive)
{
City = dataEntity.City
}
}
}

问题:

一个Company可能由许多 Departments 组成。如果我想急切地从CompanyRepository加载这些当获取Company时那么我将在哪里定义 Department 之间的映射和一个 DepartmentDataEntity

我可以在 CompanyRepository 中提供更多映射方法,但这很快就会变得困惑。很快整个系统就会出现重复的映射方法。

解决上述问题的更好方法是什么?

最佳答案

My repositories deal with and provide persistence for a rich domain model. I do not want to expose the anemic, Entity Framework data entity to my business layers, so I need some way of mapping between them.

如果您使用 Entity Framework ,它可以映射丰富的域模型本身。

我回答过类似的问题"Advice on mapping of entities to domain objects"最近。

我一直在使用 NHibernate,并且知道在 Entity Framework 中您还可以指定从数据库表到 POCO 对象的映射规则。在 Entity Framework 实体上开发另一个抽象层需要额外的努力。让 ORM 负责所有 mappings ,状态跟踪,unit of workidentity map现代 ORM 知道如何处理所有这些问题。

AutoMapper could be used for the opposite situation (mapping to data entities) but not when creating domain models.

你完全正确。

当一个实体可以映射到另一个实体而无需额外的依赖项(例如存储库、服务等)时,Automapper 非常有用。

... where would I define the mapping between a Department and a DepartmentDataEntity?

我会把它放入 DepartmentRepository并添加方法IList<Department> FindByCompany(int companyId)以便检索公司部门。

I could provide more mapping methods in the CompanyRepository, but this will soon get messy. There would soon be duplicated mapping methods across the system.

What is a better approach to the above problem?

如果需要获取Department的列表对于另一个实体,应将新方法添加到 DepartmentRepository并简单地在需要的地方使用。

关于.net - 存储库模式以及域模型和 Entity Framework 之间的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20944865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com