【发布时间】:2020-04-14 05:38:05
【问题描述】:
由于我的应用程序必须使用大量标识符,因此我考虑使用 Id<T> 类对它们进行抽象。这个类可以像 Guid 一样工作,它有一个 CreateNew() 方法等等,但是会根据 T 的类型创建一个不同的 Id。
例子:
var id = Id<Individual>.CreateNew(); // == "INDIVIDUAL-12345"var id = Id<Organization>.CreateNew(); // == "ORGANIZATION-67890"
现在,Individual 和 Organization 实现了接口 IUser。
现在我希望我的 Id 处理不同的实现,但这不起作用。
即考虑以下类,使用 Id:
class Transaction{
private Id<IUser> _sender;
private Id<IUser> _receiver;
private Amount _amount;
public Transaction(Id<IUser> sender, Id<IUser> receiver, Amount amount {...}
}
我希望能够致电:
new Transaction(Id<Individual>.CreateNew(), Id<Organization>.CreateNew(), new Amount());
但这是不可能的,因为构造函数要求类型为Id<IUser>。你能想到任何解决方法吗?
更新
感谢您到目前为止的回答。Id<IUser> 只是一个示例(IUser 的内容在这里并不重要),我想支持许多对象的标识符(10/15,更多在未来?)。
Id<T> 使用静态类作为助手,称为 TypesMatcher,其工作是将类型转换为前缀(即“个人”、“组织”、“事务”..)。
Id<T>.CreateNew() 或多或少看起来像这样:
[Pure]
public static Id<T> CreateNew()
{
if (!TypesMatcher.IsSupported<T>()) throw new Exception($"Type {typeof(T)} is not supported.");
string prefix = TypesMatcher.GetPrefixForType<T>();
string body = Guid.NewGuid().ToString();
return new Id<T>($"{prefix}-{body}");
}
【问题讨论】:
-
请分享
Id<T>声明 -
分享
IUser接口定义