我应该在存储库接口之外创建存储库项吗?

本文关键字:存储 创建 接口 我应该 | 更新日期: 2023-09-27 18:09:55

同事正在使用"实体和数据服务"的约定来实现我们应用程序中的存储库模式。这是他的主意,我不熟悉习语。

目前,实体和dto之间的主要区别是:

  • 实体有一个ID字段(Dtos也有,我发现它很臭);
  • Dtos有Clone方法;
  • 实体属性具有更加序列化友好的数据类型,转换由数据映射器执行;

问题是:

我应该在客户端自由创建Dtos,然后然后将它们发送到repo吗?或者我应该要求新的Dto实例仅在回购接口 ?

TDto dto = new TDto();
// edit dto properties
repo.Add(dto)

TDto dto = repo.Add(); // repo : Repository<TDto>
// edit dto properties
repo.Update(dto);

有更好的方法吗?如果这是一个偏好的问题,我更喜欢第二个选择,我是否应该注意不要把自己画到某个角落?

(免责声明:坦率地说,我认为这个Entity/Dto对于我们相对简单的客户端桌面应用程序来说是多余的,它只有微不足道的基于序列化的CRUD需求,但我愿意遵循"模式",只要它能解决问题,而不是妨碍)

更新:

我目前面临并试图解决的一个问题是"臭Id属性"。目前,添加Id时在Dto中设置Id。代码如下:

    public Patient Add(Patient patient)
    {
        patient.Id = Guid.NewGuid();
        var entity = patient.ToEntity();
        _patientsCache.Add(entity);
        this.Salvar();
        return patient;
    }

注意,方法调用返回相同的Dto,只是现在将其Id设置为由repo创建的值。我的大脑看着这个,认为"这是不对的",但我不能令人信服地证明它。

我应该在存储库接口之外创建存储库项吗?

最终,当涉及到复杂性和体系结构决策时,没有"正确"的答案。正如您所指出的,如果应用程序很小,那么在其中设计太多的层可能是多余的。另一方面,如果应用程序的规模增长了,以后就很难重构了。

关于在哪里实例化dto的问题;这只是实例化。如果你正在调用默认构造函数,而你的构造函数的行为方式没有问题——也就是说,它没有执行复杂的逻辑或做一些有副作用的事情,而只是设置一个默认的或"空"的DTO实例——那么你在哪里执行它真的无关紧要。

我建议在客户端做,因为这样更简单,节省了一次往返。

如果你不想让你的客户知道你的DTO中的"ID"字段,那么让它成为一个internal字段或属性,并在存储库代码中设置它