【问题标题】:Should I hide DTOs and View Models behind interfaces or abstractions?我应该将 DTO 和视图模型隐藏在接口或抽象后面吗?
【发布时间】:2017-08-23 01:55:21
【问题描述】:

使用 IoC 可解析接口来指定 DTO 有什么价值?

举例:

private readonly IGetTransactionsQuery _query;
private readonly ICreateTransactionCommand _createCommand;

public TransactionsController(
    IGetTransactionsQuery query,
    ICreateTransactionCommand createCommand)
{
    _query = query;
    _createCommand = createCommand;
}

[EnableQuery]
public IQueryable<ITransactionQueryModel> Get()
{
    return _query.Execute();
}

public async Task<IHttpActionResult> Post(ICreateTransactionModel transaction)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    await _createCommand.Execute(transaction);
    return Created(transaction);
}

在这里,我使用的是 ITransactionQueryModel 和 ICreateTransactionModel,而不是混凝土。这里有商业价值吗?哪些场景可以从这种方法中受益?我能想到一些,但想就用例场景

达成一些共识

注意:我只指控制器的“动作”方法,而不是构造函数,拥有 IoC 的好处是显而易见的

【问题讨论】:

  • 您从中获得的一项直接好处的可测试性。在这种情况下,松散耦合和依赖注入主题值得一读。
  • 那么,您实际上要问的是:the advantage of Dependency InjectionDependency Inversion 是什么。
  • @Steven,如果我问在一英亩的岛上拥有汽车有什么好处,我并不是在问拥有汽车的好处。这不是一个新手问题,但感谢谷歌搜索链接..以防我忘记如何使用它
  • 啊,好吧,我想我明白你在问什么(标题很混乱)。为数据对象创建抽象通常没有任何价值。抽象旨在隐藏行为,但数据对象(例如 DTO)没有任何行为,因此为它们创建抽象通常没有用,尤其是当只有一个实现时。
  • @Steven 请在答案中发布此回复,我会将其标记为“已接受”另外,为了清楚起见,请随时编辑标题

标签: c# asp.net-web-api dependency-injection


【解决方案1】:

使用接口有两个常见的原因:

  1. 作为抽象来隐藏行为
  2. 允许一组类型都公开相同的数据成员,就像它们是相同的类型一样使用。

抽象允许我们拦截、模拟或替换行为,而无需更改这些类型的消费者。仅当此类类型包含任何需要扩展或替换的行为时才需要这样做。

对于您的 DTO,它们不太可能有任何需要抽象的行为。事实上,这些对象应该有任何这样的行为。由于这个原因,这使得将 DTO 隐藏在 抽象 后面是不合理的。

您的应用程序可能具有具有某些共同点的数据对象。例如,您可能决定应用程序中的所有实体都应具有Id 属性。您可以定义包含此IdIEntity 接口或Entity 基本类型。这允许您定义对基本类型或接口进行操作的方法,而不必为系统中的每个实体一遍又一遍地指定它们。

但是,对于您的 DTO,您不太可能拥有具有相同属性集的其他 DTO。正如名称ITransactionQueryModel 所暗示的那样,这是一组定义“事务查询模型”的数据。换句话说,您将在ITransactionQueryModel 抽象和实现之间进行一对一的映射。这几乎肯定没用。

【讨论】:

  • Steve,如果我想要一个以 作为参数的通用控制器怎么办?这不是抽象 DTO 的好案例吗?
  • 顺便说一句,我拥有 .net 书中 DI 的第一个版本,将购买你的。非常尊重创作如此重要的作品! :)
  • @LastTribunal:这仍然没有理由为您的 DTO 定义抽象,除非您将接口用作泛型类型约束,在这种情况下它属于第二类。你应该记住,抽象应该抽象一些东西。如果没有什么可抽象的,抽象是没有用的。
  • @LastTribunal:很高兴听到您想购买第二版。非常感谢。
猜你喜欢
  • 2011-04-25
  • 2020-10-28
  • 2011-01-25
  • 2023-03-08
  • 2016-08-13
  • 2016-03-04
  • 2011-02-10
  • 1970-01-01
  • 2019-07-03
相关资源
最近更新 更多