【问题标题】:How to construct DTO object from controller如何从控制器构造 DTO 对象
【发布时间】:2013-09-26 06:56:30
【问题描述】:

我正在使用通过域层抽象的 MVC 模式。我可以将域对象转换为其等效的 DTO 并将其发送到顶层(即控制器并最终发送到视图)。现在如何做相反的事情?我将如何以及在哪里构造实际的 DTO 对象并将其传递给控制器​​?

【问题讨论】:

    标签: model-view-controller repository dto


    【解决方案1】:

    我发现最好的方法是使用 DTO 服务层。这将是控制器(或其他任何东西)可以调用以检索和转换 DTO 的函数集合。

    我还建议在这一层中进行域对象到 DTO 的映射(以及相反的映射),它将所有 DTO 相关的逻辑都保留在一层中。

    下面是一个DTO服务层函数的例子:

            public CustomerDto GetCustomer(Guid customerId) {
    
            var roService = new RoService<Customer>(new Repository<Customer>(_dbContextFactory));
            return _mapper.ToCustomerDto(roService.Get(customerId));
        }
    

    这将通过其 ID 检索客户实体。实体被传递给映射器对象,该对象将其转换为 CustomerDto 以便返回。

    注意我使用 AutoMapper 将我的域对象转换为 DTO。

    【讨论】:

    • 感谢您的解释。但是,在这种情况下,我们如何保存或删除客户?我相信我们会调用 roService.Save/Delete(customer)。如果是这样,这个“客户”对象在哪里初始化? (如果这是一个幼稚的问题,请原谅,因为我是 MVC 和存储库模式的新手)
    • 是的,这是正确的,您可以调用 roService.Delete(customerId)。好吧,使用此示例调用 .Get(customerId),它将返回所需的 Customer 对象。现在我们需要将该实体映射到 CustomerDto,这是在某个映射类中完成的:public CustomerDto ToCustomerDto(Customer item) { return Mapper.Map&lt;Customer, CustomerDto&gt;(item); } 这将返回一个新的 CustomerDto,其中包含您定义的所有映射字段。正如我所说,我个人使用 AutoMapper。我希望这会有所帮助。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多