从 Clean Architecture C# 中的应用层调用基础设施项目中的方法

Calling Methods in Infrastructure Project from Application layer in Clean Architecture C#

我是 Clean Architecture in C# 的新手。

根据细节,我的理解是所有业务逻辑都必须在应用层,任何基础设施级别的东西(数据库 Crud 操作、消息处理)都必须在基础设施层。

所以我开始开发了,但是发现在应用层没有对基础设施层的依赖。甚至为什么他们说将业务逻辑保留在应用层中,将基础操作保留在该层中。

没有这种依赖性,我如何访问基础层中的 CRUD 操作。

在基础设施层也有与应用层的依赖,这是我不明白的。

请有人帮忙,因为我真的被它困住了。我的应用层方法很少,还需要将输出写入DB,不知道怎么实现。

这么简单,根据描述应该是这样的


应用层

IMessageBroker.cs

Public class IMessageBroker
{
    Task<int> pushtoqueue(string queue, string message);
}

myservice.cs

public class myservice
{
   public void MyMethod
   {
      //Here I need to call the pushtoqueue method which I dont know
   }
}

基础设施层

MessageBroker.cs

public class messagebroker :Imessagebroker
{
   public task<int> pushtoqueue(string queue, string message)
   {
     // here the queue pushing code comes
   }
}

DependencyInjection.cs

services.Addscoped<IMessageBroker, MessageBroker>();

请分享您的想法..

环境

.NET 6

Azure Function Apps 4.0

您链接到的示例使用了一个称为“控制反转”(IoC) 的概念。适应您的示例并在(冗长的)句子中定义,这个概念是关于反转从应用程序层到基础设施层的依赖关系,以便应用程序层定义其对基础设施层的要求(以接口的形式)并且可以与任何实现这些接口的基础设施层。

如果您查看概述部分的图表,会发现有一个从基础结构层到应用层的箭头。这表达了基础设施层对应用层的依赖。

对于您的情况,这些组件具有以下用途:

  • IMessageBroker:应用层中的接口,定义了基础设施层必须满足的要求。
  • MyService:使用基础结构组件的服务 class。应将类型 IMessageBroker 的实例注入 class 以访问消息代理。
  • MessageBrokerIMessageBroker.
  • 的具体实现

这种方法的好处是您可以在不更改应用程序层的情况下轻松替换基础结构组件。虽然从一个消息代理更改为另一个消息代理的情况可能相对较少,但在测试时能够使用模拟对象 MyService 是非常宝贵的。

回答原问题:如何调用pushtoqueue方法?

只需将 IMessageBroker 的实例注入 MyService 并在那里使用它:

public class MyService
{
  private readonly IMessageBroker _msgBroker;

  public MyService(IMessageBroker msgBroker) 
  {
    _msgBroker = msgBroker;
  }
 
  public void MyMethod
  {
    //Here I need to call the pushtoqueue method which I dont know
    _msgBroker.PushToQueue("queue", "message");
  }
}

在您的示例中,您已经将 IMessageBroker 的注册添加到 IoC 容器中,因此在创建 MyService 时注入实例。


附带说明:遵循命名约定可以提高其他程序员的可读性。我已经从问题中更改了一些名称。有关 C# 命名约定的概述,请参阅此 link