我是DDD/Clean Architecture的新手我正在尝试在一个新的从头开始的应用程序中实现这个架构,我在某些方面感到困惑。我正在努力做出最好的选择,以免后悔,因为应用程序将开始增长。也许我的问题有点愚蠢,但我还是在DDD的新手,并试图做出最好的选择。
我试图坚持这个例子https://github.com/ardalis/CleanArchitecture从Ardalis
这是我的模型/问题的简化
-ApplicationAggregateRoot
——应用程序
——实例
应用程序有一个实例列表。
现在我必须做一个HTTPRequest "/operationA"在实例上,这可以通过我的blazor UI或我的API通过控制器来完成。
此HTTP请求的结果"/operation "将不得不保存在我的存储库中,并做其他事情,所以从我在这里的理解,我需要一个事件,当我有http响应类似于"OperationAFinishedEvent">
我真的不知道如何弄清楚的是,我应该如何在我的控制器/blazor中进行这个调用。
我该怎么办(伪代码):
)
_repository.GetApplicationById(1).Instances.First(i => i == id).OperationA()
并在实例的OperationA()方法中引发一些事件(类似于"OperationASentEvent"),它将连接到一个处理程序,该处理程序将调用_httpClient.OperationA(instance.Url)
或者我应该通过域服务类来执行调用,而不是像 这样的事件:B)
class Controller
{
OperationA(Instance instance)
{
_instanceService.OperationA(instance)
}
}
class InstanceService
{
void OperationA(Instance instance)
{
_httpClient.OperationA(instance.Url);
new OperationAFinishedEvent(instance);
}
}
C)或者直接呼叫
_httpClient.OperationA(instance.Url);
new OperationAFinishedEvent(instance);
从控制器和blazor
还是别的?
谢谢的
听起来你有一个Blazor客户端应用程序以及一个服务器端应用程序,你可以通过API访问。所以让我们来解决应用程序的两边。
在Blazor中,你通常会最小化应用程序逻辑,并且主要只是调用API。因此,在Blazor中启动应用程序实例的操作所需的代码应该如下所示:
var result = await _httpClient.PostAsync(endpointUrl, data);
如果这是一个长时间运行的流程,您可能会返回一个结果,该结果为您提供了另一个端点,您可以查询状态。否则,结果应该只是让您知道进程是否成功完成。
在您的API中,您将拥有各种端点。通常情况下,这些端点对应于资源和可以用来改变这些资源状态的操作。您的API资源通常与您的领域模型对应,但并不总是100%对应。通常应该避免将HTTP api用于远程过程调用(RPC)操作,因为它们实际上并不是为此目的而设计的。相反,通常从请求和响应的角度来思考。想象一下,你想让市政府做一些事情,你的方法是填写一张表格交给职员。当行动完成后,他们会把更多的文书工作交给你。职员就是你的API。论文是您的请求和响应对象。实际操作——"实例操作"是在办公室里发生的,你不把它当作客户,你和它没有任何直接的互动。你可能有这样一个资源:
/应用程序/123//234/实例PendingOperations
可以列出挂起的操作。您可以POST一个新的操作请求。等。可能还有一个资源…或者你可能会为你的挂起操作返回一个id,你可以稍后使用它来查看它的状态。这个想法是用一个表示名词(资源)而不是动词(做某事)的端点。
希望有帮助!
您的域层(聚合根在那里)应该只关心它们的内部状态。应用程序层(您还可以在其中使用存储库)可以使用来自聚合根的数据调用到其他服务的接口。接口随后在一个单独的层中实现。