【发布时间】:2019-10-08 08:20:28
【问题描述】:
来自这个惊人的课程:Applying Functional Principles in C#
我正在尝试应用领域驱动设计、功能原理和面向铁路的编程方法。
谁能帮我把下面的那几行代码精简一下?
我知道我需要创建一些 Result of T 扩展方法,我尝试过但无法让它们工作。
伪代码的作用是……
- 创建一个电子邮件值对象 -> Email.Create
- 创建和 EmailAddress 实体 -> EmailAddress.Create
- 结果存储在 T 变量 emailAddress 的 Result 中
(我们在访问数据库进行更新操作之前执行此操作,如果我们得到无效的EmailAddress,则完全没有任何意义访问数据库)
(由于需要稍后提供变量 emailAddress,铁路被破坏了:(太伤心了!!。更糟糕的是......未检查失败的 EmailAddress Result 实体,应该检查)
- 通过播放器存储库按 Id 获取播放器 -> repository.GetAsync("336978e9-837a-4e8d-6b82-08d6347fe6b6")
- 结果存储在T变量playerResult的Result中
(由于稍后需要使用变量 playerResult 导致铁路再次损坏 :( 太可悲了!!。更糟糕的是……未检查返回结果失败的播放器实体,它应该是)
- 将新创建的 EmailAddress 添加到 Player 电子邮件地址集合 -> p.AddEmailAddress(emailAddress.Value)
(铁路又被破坏了:(太伤心了!!。更糟糕的是......没有检查将电子邮件地址添加到玩家收藏的失败,它应该检查)
- 最后异步保存更改并返回受影响的行数。
为简洁起见,以下代码行减少
var emailAddress = Email.Create("jamesbond@gmail.com")
.OnSuccess(email => EmailAddress.Create(email, default));
var playerResult = await emailAddress.OnSuccess(e => repository.GetAsync("336978e9-837a-4e8d-6b82-08d6347fe6b6")).ToResult(""));
var wasAdded = playerResult.OnSuccess(p => p.AddEmailAddress(emailAddress.Value));
var wasSaved = await wasAdded.OnSuccess(a => unitOfWork.SaveChangesAsync());
var message = wasSaved
.Ensure(r => r > 0, "No record were saved")
.OnBoth(result => result.IsSuccess ? "Ok" : result.Error);
这里是方法的签名
Email.Create -> public static Result<Email> Create(string email)
EmailAddress.Create -> public static Result<EmailAddress> Create(Email mailAddress, string mailAddressInstructions)
GetAsync -> public Task<Maybe<Player>> GetAsync(string id)
AddEmailAddress -> public Result<bool> AddEmailAddress(EmailAddress emailAddress)
SaveChangesAsync -> public async Task<int> SaveChangesAsync()
我进行了一些单元测试,代码可以正常工作,但就您所见,与铁路相关的工作还很遥远。
提前致谢。
【问题讨论】: