对 Response 类型进行别名的最紧凑方法是什么?

What is the most compact way of aliasing a Response type?

提问人:jeancallisti 提问时间:6/1/2023 最后编辑:Progmanjeancallisti 更新时间:6/1/2023 访问量:30

问:

.Net 6、c# 10 .Net 7、c#11 或更高版本

这个问题不仅与别名有关。它更广泛。

场景:

public class Item {
    public int x { get; set;}
}

public interface IMyController {
    public Task<IEnumerable<Item>> GetItems();
}

public class MyController {

     public async Task<IEnumerable<Item>> GetItems() {
          return new List<Item>() { ... };
     }
}

想要公开 API 的接口(在本例中为 IMycontroller)是一种常见方案

但是,我很生气,因为返回类型是一个复杂的类型(某物的枚举)。我希望界面是密闭的,不会给最终用户留下任何东西。我想要一个 GetItemsReponse 类型。

GraphQL 这样的 Typescript 库是这样做的:

export interface Item { ... }
export type Items = Item[];
export type GetItemsResponse = Items;

问题:

在 C# 中,没有类型的按需通用别名。

解决方案#1:文件中的本地别名。

IMy控制器:.cs

using GetItemsResponse = IEnumerable<Item>;

public interface IMyController {
    public Task<GetItemsResponse> GetItems();
}

不完全令人满意,因为最终用户必须在自己的代码中做同样的事情:

using GetItemsResponse = IEnumerable<Item>;

解决方案#2:全局别名

global using GetItemsResponse = IEnumerable<Item>;

对于大多数人来说,这是一个很好的解决方案,但对我来说,这是一个问题,因为我有几种名为“GetItemsResponse”的类型——那是因为我使用版本控制的 API。我不希望这些名字开始在全球范围内发生冲突。

global using GetItemsResponse = IEnumerable<ItemV1>;
global using GetItemsResponse = IEnumerable<ItemV2>; // uh oh, same name!

namespace My.API.v1 {
    public interface IMyController {
        public Task<IEnumerable<ItemV1>> GetItems(); // I want it to return GetItemsResponse 
    }
}

namespace My.API.v2 {
    public interface IMyController {
        public Task<IEnumerable<ItemV2>> GetItems(); I want it to return GetItemsResponse 
    }
}

解决方案#3:继承类型

public class GetItemsResponse : List<Item> {
    ...
}

不是很好,因为现在我必须从构造函数开始重新实现 的许多基础方法。List

结论:

在现代 C# 中,有没有一种优雅而紧凑的方式让我忽略了?首先关注 C#11 或更高版本,最后关注 C#10。

C# 10.0

评论

0赞 ChrisBD 6/1/2023
我没有完全遵循你想做的事情。你确定你没有过度思考某个问题吗?您不喜欢的响应类型是什么?IEnumerable<Item>
0赞 jeancallisti 6/1/2023
请参阅显示 GraphQL 如何执行此操作的部分。我真的希望它牢不可破。例如,如果我决定从 IEnumerable 更改为 IReadOnlyList,则最终用户可能不会注意到重大更改。就像 GraphQL 和其他库一样,我希望 Response 在任何情况下都被称为“Response”,句号。

答: 暂无答案