C# 将存储库的结果映射到域层中的聚合实体

C# 将存储库的结果映射到域层中的聚合实体,c#,repository-pattern,dapper,cqrs,clean-architecture,C#,Repository Pattern,Dapper,Cqrs,Clean Architecture,我在一个以.NETCore3和C为语言的项目中工作。 我尝试使用干净的体系结构方法、CQR和存储库模式。我选择了整洁作为ORM 我有3层: 域:具有我的实体、聚合实体、值对象; 应用程序:在这里,我使用查询和命令CQR以及接口来实现逻辑,例如我将在持久性层中实现的存储库; 持久性:使用DAPPER,该层共享域的相同实体。 我怀疑如何创建聚合实体。例如: 类Person是一个聚合,一个人可以有1到NPhoto 类PersonHasPhotos指定用户希望在其主页中看到照片的屏幕位置 public

我在一个以.NETCore3和C为语言的项目中工作。 我尝试使用干净的体系结构方法、CQR和存储库模式。我选择了整洁作为ORM

我有3层:

域:具有我的实体、聚合实体、值对象; 应用程序:在这里,我使用查询和命令CQR以及接口来实现逻辑,例如我将在持久性层中实现的存储库; 持久性:使用DAPPER,该层共享域的相同实体。 我怀疑如何创建聚合实体。例如:

类Person是一个聚合,一个人可以有1到NPhoto

类PersonHasPhotos指定用户希望在其主页中看到照片的屏幕位置

public class PersonHasPhotos
    {
        public PersonHasPhotos()
        {
        }

        public int PersonId { get; set;}
        public int PhotoId { get; set;}
        public string PositionOnTheScreen { get; set;}

        public Photo Photo { get; set;}
        public Person Person { get; set;}


    }
在我的应用层中,我为每个实体定义了一个存储库。每个存储库都有特定于实体的简单作业,只有简单CRUD,没有JOIN。我选择这个是因为我将在应用层中使用存储库,在那里我可以放置逻辑,也可以管理事务

我有IPersonRepository、IPhotoRepository和IpersonhasPhotopository

在我的应用层中,我有一个名为GetPersonint id的查询。在这个查询的处理程序中,我调用这些存储库

在使用DAPPER的持久层中,我可以将查询结果直接映射到实体。 域实体在所有层中都是共享的,我不想把逻辑放在持久层来解释如何创建聚合实体

问题是,这些存储库为我提供了3个不同的对象Person、List、List,但我只想将它们合并到一个objectperson中,并使用其他对象增强其属性

我该怎么办?我哪里做错了?

我看到两种选择

这三个存储库返回不同的实体实例,并根据它们的ID链接和比较它们

选择工作单元模式,让一个存储库始终返回所有三个实体的组合


你认为增强属性的person实体是什么样子的?@ChetanRanpariya就像我在帖子中写的第一个实体person,但通过这种方式,我可以浏览属性,也可以输入特定的逻辑。例如,我可以亲自放置一个方法,从照片集合中提取特定的照片?您可以在它上面运行linq来选择特定的项目,然后获取它的照片属性吗?目前,您如何使用Dapper?@ChetanRanpariya和Dapper I为3个实体定义了3个存储库来填充person对象。当我使用Dapper获取Person时,我会收到实体Person,而其他所有属性都为空,因为我希望每个存储库在一个特定的表上工作,而不知道该表是如何连接的。如果你读了我的文章,你会发现我的问题不是如何从一个集合中读取,而是我应该在哪里将这3个对象聚合在一起,以及我如何才能做到这一点。
public class Photo
    {
        public Photo()
        {
        }

        public int Id { get; set;}
        public string Description { get; set;}
        public byte[] Photo { get; set;}


    }
public class PersonHasPhotos
    {
        public PersonHasPhotos()
        {
        }

        public int PersonId { get; set;}
        public int PhotoId { get; set;}
        public string PositionOnTheScreen { get; set;}

        public Photo Photo { get; set;}
        public Person Person { get; set;}


    }
public interface IPersonHasPhotosRepository
    {
        IEnumerable<PersonHasPhotos> GetForPerson(int PersonId);

    }

public interface IPhotosRepository
    {
        IEnumerable<Photos> Get(int PersonId);

    }

public interface IPersonRepository
    {
        Person Get(int PersonId);

    }