我应该如何发送HTTP请求在干净的架构在c#



我是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,你可以稍后使用它来查看它的状态。这个想法是用一个表示名词(资源)而不是动词(做某事)的端点。

希望有帮助!

您的域层(聚合根在那里)应该只关心它们的内部状态。应用程序层(您还可以在其中使用存储库)可以使用来自聚合根的数据调用到其他服务的接口。接口随后在一个单独的层中实现。

最新更新