C# 我应该将DTO和视图模型隐藏在接口或抽象后面吗?

C# 我应该将DTO和视图模型隐藏在接口或抽象后面吗?,c#,asp.net-web-api,dependency-injection,C#,Asp.net Web Api,Dependency Injection,使用IoC可解析接口指定DTO有什么价值 例如: private readonly IGetTransactionsQuery _query; private readonly ICreateTransactionCommand _createCommand; public TransactionsController( IGetTransactionsQuery query, ICreateTransactionCommand createCommand) { _qu

使用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);
}
private readonly IGetTransactionsQuery\u查询;
私有只读ICreateTransactionCommand _createCommand;
公共事务控制员(
IGetTransactionsQuery查询,
ICreateTransactionCommand(创建命令)
{
_查询=查询;
_createCommand=createCommand;
}
[启用查询]
公共IQueryable Get()
{
返回_query.Execute();
}
公共异步任务Post(ICreateTransactionModel事务)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
wait_createCommand.Execute(事务);
创建的退货(交易);
}
这里,我使用ITransactionQueryModel和ICreateTransactionModel,而不是具体化。这里有商业价值吗?哪些场景可以从这种方法中受益?我可以想到一些,但我想对用例场景达成一些共识


注意:我只是指控制器的“动作”方法,而不是构造函数,使用IoC的好处显而易见。使用接口有两个常见原因:

  • 作为抽象来隐藏行为
  • 允许所有公开相同数据成员的一组类型被用作相同的类型
  • 抽象允许我们拦截、模拟或替换行为,而无需更改这些类型的使用者。仅当此类类型包含任何需要扩展或替换的行为时,才需要此选项

    就DTO而言,它们不太可能有任何需要抽象的行为。事实上,这些对象不应该有任何这样的行为。因此,将DTO隐藏在抽象的后面是不合理的

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


    但是,在DTO的情况下,不太可能有其他具有相同属性集的DTO。顾名思义,这是一组定义“事务查询模型”的数据。换句话说,您将在
    ITransactionQueryModel
    抽象和实现之间有一对一的映射。这几乎毫无用处。

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

  • 作为抽象来隐藏行为
  • 允许所有公开相同数据成员的一组类型被用作相同的类型
  • 抽象允许我们拦截、模拟或替换行为,而无需更改这些类型的使用者。仅当此类类型包含任何需要扩展或替换的行为时,才需要此选项

    就DTO而言,它们不太可能有任何需要抽象的行为。事实上,这些对象不应该有任何这样的行为。因此,将DTO隐藏在抽象的后面是不合理的

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


    但是,在DTO的情况下,不太可能有其他具有相同属性集的DTO。顾名思义,这是一组定义“事务查询模型”的数据。换句话说,您将在
    ITransactionQueryModel
    抽象和实现之间有一对一的映射。这几乎肯定是无用的。

    您从中获得的一个即时好处的可测试性。松散耦合和依赖注入的主题在本文中值得一读。所以,你实际上要问的是:什么是和。@史蒂文,如果我问在一英亩的岛上拥有一辆车有什么好处,我不是在问拥有一辆车有什么好处。这不是一个新手问题,但感谢谷歌的搜索链接……以防万一我忘了如何使用itAh,好吧,我想我明白你的意思了(标题很混乱)。为数据对象创建抽象通常没有任何价值。抽象意味着隐藏行为,但数据对象(如DTO)没有任何行为,因此为它们创建抽象通常是没有用的,特别是当只有一个实现时。@Steven请在回答中发布此回复,我也会将其标记为“已接受”,请随意编辑标题,以明确您从中获得的一个即时好处的可测试性。松散耦合和依赖注入的主题在本文中值得一读。所以,你实际上要问的是:什么是和。@史蒂文,如果我问在一英亩的岛上拥有一辆车有什么好处,我不是在问拥有一辆车有什么好处。这不是一个新手问题,但感谢谷歌的搜索链接……以防万一我忘了如何使用itAh,好吧,我想我明白你的意思了(标题很混乱)。为数据对象创建抽象通常没有任何价值。抽象意味着隐藏行为,但数据对象(如DTO)没有任何beh