代码之家  ›  专栏  ›  技术社区  ›  VAAA

每个DB实体或模块的C#存储库模式[关闭]

  •  1
  • VAAA  · 技术社区  · 6 年前

    我有一个 c# WebApi 使用的项目 Dapper Repository Pattern 对于数据层。

    在其他项目中,我创建了一个按模块存储库或按业务逻辑创建的存储库。因此,我不是为每个实体都有一个存储库,而是创建一个可以包含对多个实体的内部引用的存储库,因为不是所有的实体或数据库表都会有更新、删除和插入。

    EmployeeRepository ,在这个存储库中,我将处理与员工相关的任何事情,因此在这个repo中,我可以处理许多与员工相关的表。

    SQL 数据库大约有350个表,但在这个项目中,我只是怀疑,如果正确的方法是为每个表或实体创建一个存储库,每个表或实体都有自己的添加、获取、删除、更新、删除等。

    雇员职位 例如,如果要管理我处理的员工数据,假设有5个表:

    • 雇员
    • 员工时间表
    • 员工休假

    那么我将有5个存储库,因此:

    • 雇员职位
    • 雇员合同存储库
    • 员工假期存储库

    如果上面的方法是正确的,是否有任何插件可以为您生成实体模型类,这样您就不必一个一个地手动生成了?

    最佳实践模式是什么?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Maxim Zabolotskikh    6 年前

    在我看来,这方面没有最佳实践。它更受项目的实际需求以及这些存储库将如何使用的驱动。

    我的指导原则是“什么是我的主要实体,什么是我的从属实体”。假期或休假离不开员工,所以我可以想象一个员工信息库,上面写着:

    GetEmployee(employeeId)
    GetEmployeeHoliday(employeeId)
    GetEmployeeLeave(employeeId)
    

    依赖实体的id在这里并不重要,因此单独的存储库可能会有点过头。

    如果您决定使用350个存储库,我至少会考虑一下通用存储库基类,它将为您提供通用的GetById、Save、Find等方法。而不是只扩展那些逻辑性更强的存储库。我认为这不会超过50个,而且从第一个方法来看,这些或多或少是你的“主要实体”。

    总之,这一切都是自以为是的,最终取决于你,你的个人喜好和你的项目需求。

        2
  •  0
  •   Daniel Lorenz    6 年前

    对我来说,更重要的是业务层不应该直接与实体合作。相反,BL使用一个域或某种类型的DTO,然后传递到一个存储库,该存储库处理的类型是“嘿,为我保存这个”。然后,存储库本身将该域/dto带到BL知道的项中,然后将其转换为您想要用来持久化它的任何实体/技术(EF/Dapper)。将来,如果您需要将其发送到WebApi调用,您可以在那里对其进行更改,而上面的任何内容都不会在意。但是很明显,由于它是对业务类型的实体作出反应,所以最终几乎得到了业务存储库,但我认为它提供了最大的灵活性。

    编辑:示例:

    public class EmployeeBL
    {
        private readonly ICreateEmployeeRepository _repo...
    
        public IResult CreateEmployee(CreateEmployeeRequestDto dto)
        {
             // Business Logic here
             EmployeeCreateDomainState request = ... Mapped from dto/business logic
             var rowsAffected = _repo.Execute(item);
             ...
        }
    }
    
    public class CreateEmployeeRepository : ICreateEmployeeRepository
    {
        public CreateEmployeeRepository (IoC inect stuff)...
    
        public int Execite(EmployeeCreateDomainState request)
        {
            using (var empCtx = EmpDbContextFactory.Create())
            {
                 var employeeEntity = ... // Map from request
                 var employeeAddressEntity = ... // Map from request
                 empCtx.Employees.Add(employeeEntity);                 
                 empCtx.EmployeeAddresses.Add(employeeAddressEntity );
                 return empCtx.SaveChanges();
            }
        }
    }
    

    您还可以拥有一个通用存储库,如: