我试图在WebAPI控制器上发布多个参数.一个参数来自URL,另一个参数来自正文.这是网址:
/offers/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/prices/
这是我的控制器代码:
public HttpResponseMessage Put(Guid offerId, OfferPriceParameters offerPriceParameters)
{
//What!?
var ser = new DataContractJsonSerializer(typeof(OfferPriceParameters));
HttpContext.Current.Request.InputStream.Position = 0;
var what = ser.ReadObject(HttpContext.Current.Request.InputStream);
return new HttpResponseMessage(HttpStatusCode.Created);
}
Run Code Online (Sandbox Code Playgroud)
正文的内容是JSON:
{
"Associations":
{
"list": [
{
"FromEntityId":"276774bb-9bd9-4bbd-a7e7-6ed3d69f196f",
"ToEntityId":"ed0d2616-f707-446b-9e40-b77b94fb7d2b",
"Types":
{
"list":[
{
"BillingCommitment":5,
"BillingCycle":5,
"Prices":
{
"list":[
{
"CurrencyId":"274d24c9-7d0b-40ea-a936-e800d74ead53",
"RecurringFee":4,
"SetupFee":5
}]
}
}]
}
}]
}
}
Run Code Online (Sandbox Code Playgroud)
知道为什么默认绑定无法绑定到offerPriceParameters我的控制器的参数?它始终设置为null.但是我能够使用the从身体恢复数据DataContractJsonSerializer.
我也尝试使用FromBody参数的属性,但它也不起作用.
这是我的情况:
我的问题:
我最初的解决方案:
我最初的解决方案限制:
我的问题(最终!):
所有这些都变得非常复杂,并且增加了错误风险和代码维护问题。我真的不喜欢它!有没有人已经遇到过这种问题?他们可以接受的解决方法吗?有人对我的方案有一个干净的解决方案的想法吗?
谢谢!
如果考虑使用标准的持久性存储库,则解决方案很简单。我们将IStuffRepository放在域层中,并将StuffRepositoryImplementation放在基础结构层中。
但是,当我们要包装第三方API时,好的模式是什么?
我们可以应用相同的模式,在域层具有IStuffGateway,在基础结构层具有StuffGatewayImplementation。
但是这种方法存在问题。当我们考虑持久层时,我们可以控制我们所持久的数据。但是,当我们考虑使用第三方API时,我们无法控制,这意味着我们可以尝试具有特定的接口签名,但是它必须受包装的内容的影响。因此,如果我们更改实现(用另一个替换第三方),则接口签名可能会更改,并且域也会更改。
另一种方法可能是将接口移出域,并随其实现一起放入基础架构层。这样,应用程序层可以毫无问题地使用它(并保持域完整)。但是这种方法从领域中删除了重要的概念,在我看来,这似乎很糟糕。
对此有任何参考意见吗?
在 DDD 文献中,返回域事件模式被描述为管理域事件的一种方式。从概念上讲,聚合根保留了一个域事件列表,当您对其进行某些操作时会填充该列表。
当对聚合根的操作完成后,DB 事务在应用服务层完成,然后应用服务对域事件进行迭代,调用事件调度器来处理这些消息。
我的问题是关于我们现在应该如何处理交易。Event Dispatcher 是否应该负责为它处理的每个事件管理一个新事务?或者应用程序服务应该在它调用域事件调度器的域事件迭代中管理事务?当调度程序使用像 RabbitMQ 这样的基础设施机制时,问题是无关紧要的,但是当域事件在进程中处理时,问题就无关紧要了。
与我的问题相关的子问题。您对使用 ORM 钩子(即:NHibernate 的 IPostInsertEventListener、IPostDeleteEventListener、IPostUpdateEventListener)在聚合根上启动域事件迭代而不是在应用程序服务中手动执行此操作有何看法?它是否增加了太多的耦合?是否更好,因为它不需要在每个用例中编写相同的代码(域事件在聚合上循环,如果它不在调度程序内部,则可能创建新事务)?
我不知道如何在我的场景中使用"盐概念".
假设我有一个客户端桌面应用程序,它为特定用户加密数据并将其发送到远程服务器.客户端应用程序使用用户密码和SALT生成PKCS#5的密钥.远程桌面绝不能与用户的密码联系.
假设我们为加密生成随机盐.客户端应用程序可以加密数据,并将其发送到远程服务器.如果用户试图在另一台计算机上访问他的数据,那么它将如何解密它,因为盐是未知的?
我认为一直使用相同的盐(在应用程序中硬编码)并不是一个好主意(混淆的安全性很差).
我怎样才能解决我的问题?
假设我有一个聚合根Tenant和一个聚合根Organization。多个组织可以链接到单个租户。承租人只有在标识中的组织在它的聚合。
假设我在组织聚合中有以下不变量:组织只能有一个特定产品类型的订阅。
假设我在租户聚合中有以下不变量:与租户相关的所有组织中必须只存在一个产品类型订阅。
我们如何使用每个交易规则的一个聚合来强制执行这些不变量?在向Organization添加订阅时,我们可以轻松验证第一个不变量,并触发域事件以更新(最终一致性)租户,但是如果不变量在租户聚合中被违反会发生什么?
这是否意味着触发另一个域事件以回滚组织聚合中发生的事情?在成功修改第一个聚合后将响应发送到 UI 的情况下,这似乎很棘手。
或者这里的真正方法是在启动更新之前使用域服务来验证两个聚合的不变量?如果是这样,我们是将不变量/规则直接放在域服务中,还是将某种布尔验证方法放在聚合上以保持逻辑在那里?
更新 如果 UI 必须阻止用户在违反一个不变量的情况下保存在 UI 中怎么办?在这种情况下,我们甚至不会尝试更新聚合。