当前位置: 首页 > 知识库问答 >
问题:

DTO接口

段坚
2023-03-14

我目前正在开发一个大型web应用程序,主要包含一个Angular SPA和一个可以访问后端层的OData WebAPI
我们处于早期阶段,已经开始实现第一个类,包括一个模型。位于公共命名空间中的dll,以便所有层都可以访问它
我们现在正在讨论模型中的DTO。有人说使用接口是绝对必要的,因此代码如下:

namespace MySolution.Common.Model
{
    public interface IPerson
    {
        int Id { get; set; }
        string Name { get; set; }
        ...
    }
}

namespace MySolution.Common.Model
{
    public class PersonDTO : IPerson
    {
        public int Id { get; set; }
        public string Name { get; set; }
        ...
    }
}

就是这样。只是简单的DTO,没有更多的智能
我现在问自己,这是否真的是一个好方法,因为我不认为有必要在这里使用界面<这有什么好处?提到了可测试性,但是否有必要测试DTO?依赖注入也不应该是重点<任何启示都会很有帮助。最后,学习新的东西和方法总是好的。。。


共有3个答案

吕修伟
2023-03-14

我遇到了这种情况,我正在编写一个应该松散耦合的api,因为我可以调整它的任何部分以使其行为不同,比如更改存储,或者更改请求中的一些参数,这样它就可以有另一种行为,而不影响已经存在的内容。

考虑到这一点,为DTO提供一个接口是有效的,因为另一次它可以更改其属性以承载更多数据,并且您只需实现一个抽象,在其中您将使用这个新实现的DTO,映射新参数,在服务中使用以注册记录。

然后将接口(抽象)绑定到dto的新实现以及将要进行修改的地方。

然后,您不会更改程序的行为,也不会对已经存在的内容进行更改。

所以你也必须考虑你的api会是怎样的。

欧阳飞章
2023-03-14

作为一个例子,继我的上述评论之后:

Interface IRepo
{
  Person GetPerson(int id);
}

Public class DbRepo : IRepo
{
  public Person GetPerson(int id){//get person from database}
}

Public class FakeRepo : IRepo
{
  public Person GetPerson(int id)
  {
    return new Person {Id = id, Name = "TestName"};
  }
}

出于测试目的,您可以对一些模拟对象使用FakeRepo。

国盛
2023-03-14

DTOs传输状态-仅此而已。通过容器注入或模拟它们进行测试似乎毫无意义(如果这是动机的话),而且完全没有必要。不要这样做。

 类似资料:
  • 如果我有实体类 和一个DTO > 我的问题是我应该在客户端中使用(赢形)吗?或创建另一个类 如果我想要一个方法 我应该把它放在哪里(作为静态的辅助方法,还是放在里面)?我以前认为应该是里面的方法,但是贫血模型不允许有任何方法。

  • 我开始使用JOOQ和dvd租赁商店数据库aka sakila。基本上,我想找一个演员和他的角色(我创建的表)。到目前为止,我想到了这个: 我希望能够将演员及其角色提取到一个对象中:DTO。我找到了这篇文章https://arnaudroger.github.io/blog/2017/03/02/jooq-one-to-many-without-dto.html但我发现使用sfm的解决方案过于冗长,

  • 问题内容: 我们将使用DTO在表示层之间来回发送数据。我们有像这样的图层: facade appService domain 并且我们使用推土机来帮助我们将实体转换为dto。但是我现在有两个问题: 从实体到dto,我们可以使用推土机,但是从dto到实体,我们可以使用推土机吗?如果是,如何? 我应该在哪里创建实体?在外观或DTOAssembler中? 例如,我必须注册一本书。这本书的实体外观如下:

  • 我在这个表单下有一个json响应。 如何访问位置值?对于列表中的所有dto对象,place值都是相同的,也就是OFFICE,所以我只需要以某种方式访问其中一个place值。CalendarDto列表包含多个EventDto对象,其属性为id、name、color和Place。

  • 我已经用MapStruct 1.1工作了几天,但还没有达到我所需要的。 我想做的是:我想将JPA实体映射到DTO,以便在Primefaces项目中实现更好的属性视图绑定。 所以我有我的实体如下: 病人JAVA 人JAVA 我想把这些实体画成这样: 耐心等待。JAVA 潘松多。JAVA 我编写了Mapper类和一个实用程序,就像GitHub上的官方示例中描述的那样(https://github.co

  • 我在后端代码中使用了Spring数据jpa。我已经包含了实体,dto接口,服务和jpa存储库代码。 现在的问题是,当我在< code>TopicService中调用< code>getAllTopics()时。它返回< code>Topic对象的列表,而不是< code>TopicDto。< code>Topic对象包含一个< code >示例列表,我没有将它包含在< code>TopicDto中