The diagram below shows the essential dependencies (project references) between the projects in the solution (IssueTracking.
part is not shown to be simple)
解决方案中各项目之间的基本依赖关系(项目引用关系)(为了简化IssueTracking.
部分没有显示):
The projects have been explained before. Now, we can explain the reasons of the dependencies;
前面我们已经解释过这些项目。现在,我们可以解释这些依赖项的原因。
Domain.Shared
because it is already a (shared) part of the domain. For example, an IssueType
enum in the Domain.Shared
can be used by an Issue entity in the Domain project.Domain.Shared
,因为它已经是Domain
的一个(共享)部分。例如,Domain.Shared
中的枚举类型IssueType
可以被Domain项目中的Issue实体使用。Domain.Shared
. In this way, you can reuse these types in the DTOs. For example, the same IssueType
enum in the Domain.Shared
can be used by a CreateIssueDto
as a property.Domain.Shared
。通过这种方式,你可以在DTO中重用这些类型。例如,Domain.Shared
中的同一个IssueType
枚举可以被CreateIssueDto
作为一个属性使用。Application.Contracts
since it implements the Application Service interfaces and uses the DTOs inside it. It also depends on the Domain
since the Application Services are implemented using the Domain Objects defined inside it.Application.Contracts
,因为它实现了应用服务接口并使用其中的DTO。它也依赖于Domain
,因为应用层服务是通过它里面定义的Domain对象实现的。Domain
since it maps the Domain Objects (entities and value types) to database tables (as it is an ORM) and implements the repository interfaces defined in the Domain
.Domain
,因为它将领域对象(实体和值类型)映射到数据库表(因为它是一个ORM)并实现Domain
中定义的存储库接口。Application.Contracts
since the Controllers inside it inject and use the Application Service interfaces as explained before.Application.Contracts
,因为它里面的控制器注入并使用应用服务接口,前面已解释说明过。Application.Contracts
since it can consume the Application Services as explained before.Application.Contracts
,因为它可以使用应用服务,前面已解释说明过。HttpApi
since it serves the HTTP APIs defined inside it. Also, in this way, it indirectly depends on the Application.Contracts
project to consume the Application Services in the Pages/Components.HttpApi
,因为它提供了在它里面定义的HTTP APIs。另外,通过这种方式,它间接地依赖于Application.Contracts
项目运用于页面/组件中的应用服务。When you investigate the solution, you will see two more dependencies shown with the dashed lines in the figure above. Web
project depends on the Application
and EntityFrameworkCore
projects which theoretically should not be like that but actually it is.
当你调查这个解决方案时,你会看到还有两个依赖关系,在上图中用虚线表示。Web
项目依赖于Application
项目和EntityFrameworkCore
项目,理论上不应该是这样,但实际上是这样。
This is because the Web
is the final project that runs and hosts the application and the application needs the implementations of the Application Services and the Repositories while running.
这是因为 Web
项目是运行和托管应用程序的最终项目,应用程序在运行时需要应用服务和存储库的实现。
This design decision potentially allows you to use Entities and EF Core objects in the Presentation Layer which should be strictly avoided. However, we find the alternative designs over complicated. Here, two of the alternatives if you want to remove this dependency;
这个设计决定有可能让你在表现层中使用实体和EF核心对象,这应该是不允许的。然而,我们发现替代设计过于复杂。在这里,如果你想消除这种依赖关系,有两个备选方案:
Web
项目转换为Razor类库,并创建一个新的项目,如Web.Host
,它依赖于Web
,Application
和EntityFrameworkCore
项目并托管这个应用程序。你不在这里写任何UI代码,而只用于托管。Application
and EntityFrameworkCore
dependencies from the Web
project and load their assemblies on application initialization. You can use ABP's Plug-In Modules system for that purpose.Web
项目中移除Application
和EntityFrameworkCore
依赖,并在应用程序初始化时加载它们的程序集。你可以使用ABP的插件模块系统达到此目的。手机扫一扫
移动阅读更方便
你可能感兴趣的文章