问题标签 [ardalis-cleanarchitecture]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
34 浏览

ardalis-cleanarchitecture - 在 Ardalis Clean Architecture 模板中,BaseEntity 是否应该完全公开 DomainEvents 列表?

BaseEntity 允许完全访问列表事件,这对我来说似乎不正确。当然,实体应该是唯一允许管理域事件集合的东西。当前的实现甚至允许以下代码:

遵循仅获取 IReadOnlyList 并且底层列表是私有的并且只能通过受保护的 AddEvent 方法和公共 ClearEvents 方法修改的模式会更好吗?我不确定是否应该允许实体之外的任何东西引发域事件,但如果需要,可以公开 AddEvent 吗?

此外,Id 属性也是可公开设置的。在 DDD 中,在其生命周期内更改实体的身份肯定是无效的。因此,这应该是一个 init 属性,还是只能通过构造函数设置,或者至少是一个受保护的 setter?

0 投票
1 回答
51 浏览

c# - .sln 文件中专用“解决方案项目”项目的目的

我正在查看从https://github.com/ardalis/CleanArchitecture.sln的模板生成的文件,并注意到有这部分:

“解决方案”项目的目的究竟是什么?.editorconfig它是否会导致以某种特殊方式处理列出的文件(例如 default )?我是否需要在.stylecop.json此列表中添加任何新的解决方案相关文件(例如 )?

0 投票
1 回答
134 浏览

c# - 如何在 Clean 架构和 .NET 核心中访问 EF 功能

EF 核心包含您可能希望用于复杂查询的功能。例如AsNoTracking(),SumAsyncMaxAsync查找更改/修改的实体等在Microsoft.EntityFrameworkCore程序集中可用

干净的架构中,该ApplicationCore层不允许直接访问 DBContext,并且只能通过公共存储库接口和规范访问数据

我理解关注点分离和从域层抽象持久层的想法。将来如果您更改数据库,您只需要更改持久层。然而实际上,在企业级应用程序中,您多久更改一次数据库。一旦投入生产,就很难简单地更换它。

如何访问 EF 功能?存储库应该公开这些吗?例如

0 投票
1 回答
104 浏览

c# - 清洁架构数据库优先方法 - 问题

我正在使用现有数据库实现干净的架构,使用脚手架命令我已经在基础设施层中生成了 POCO 实体,并在域层中手动创建了实体以便稍后映射它们。

在应用层,我有带有一些标准操作的通用接口存储库。

根据 Clean-Architecture 的原则,我在 Infrastructure 层中实现它。

我正在使用带有 CQRS 的调解器模式,当我尝试从 API 层保存用户时,我最终会遇到以下异常。

System.InvalidOperationException: Cannot create a DbSet for 'ABC.Domain.Entities.User' because this type is not included in the model for the context. However, the model contains an entity type with the same name in a different namespace: 'ABC.Infrastructure.Models.User'.

如果我能够将域实体映射到上述存储库实现中的基础设施实体,它将得到解决。

在上述实现中,T是 ABC.Domain.Entities.User,而不是 ABC.Infrastructure.Models.User。

由于规则清理架构所有依赖项都向内流动,核心不依赖于任何其他层。

请帮助我将传入的域实体与上述存储库实现中的基础设施实体进行映射,以便我也可以将这些通用方法用于其他实体操作。

检查我的骨架回购

https://gitlab.com/mail2mdilyas/workcontinent/-/blob/master/Work.Continent.Infrastructure/Repositories/Base/Repository.cs

在上述类中,“AddAsync”操作在通用存储库(Repository.cs)中,以后可以用于不同域实体的不同插入操作。在这里我不会知道什么是 T :

公共类存储库:IRepository where T:类

请告诉我查找传入域实体并将其映射到数据实体的通用方法。

0 投票
1 回答
56 浏览

clean-architecture - 在干净架构中创建实体时如何为实体引发域事件

我有一个使用干净架构模板创建的项目。

如果我想在创建新项目时引发域事件,我应该在哪里添加?

如果每当向项目中添加新项目时我必须引发事件,我可以在项目实体中完成该操作,如此处所示

与此处完成的 ToDoItem 的 MarkCompletion类似。

但不清楚在创建新项目时将代码放在哪里引发事件?

一种选择是在此处创建端点中执行以下操作。

但这是在 UI 中,远离领域模型,所以感觉不对。

另一种选择是使用ef 核心拦截器。因此,当调用 save changes 时,只需根据需要引发事件,例如 here

如果我在 Project ctor 中添加事件,那么即使在更新的情况下也会触发。

有没有更好的选择/模式?

任何指针都深表感谢。

0 投票
0 回答
17 浏览

ardalis-cleanarchitecture - 什么是清洁架构中的 NoOpMediator

我正在玩Ardalis 的 Clean Architecture

有人可以解释一下这个NoOpMediator在单元测试中的作用吗?

它似乎没有做任何事情。对于它的四个方法,它返回 Task.CompletedTask。对于其余两个,它返回 Task.FromResult<object?>(default)

此外,在BaseEfRepoTestFixture 类中,没有 Mock 对象的配置。有点朦胧。

0 投票
0 回答
18 浏览

nuget - 使用 Ardalis 干净架构模板搭建类时缺少 Nuget SDK

嗨,我正在尝试 Ardalis Clean Architecture。运行 VS 2022 和 dotnet 6。我正在尝试搭建一个类并在代码生成器阶段收到以下错误:

“脚手架失败。SDK 解析器失败:“基于 NuGet 的 SDK 解析器无法运行,因为无法找到 NuGet 程序集。检查您的 MSBuild 安装或将环境变量“MSBUILD_NUGET_PATH”设置为包含所需 NuGet 程序集的文件夹。System.IO.FileLoadException:无法加载文件或程序集“NuGet.Versioning,版本=6.0.0.278,文化=中性,PublicKeyToken=31bf3856ad364e35”。无法找到或加载特定文件。(0x80131621) 要查看更多信息,请通过设置环境变量 'codegen_trace' = 1 来启用跟踪。

文件名:'NuGet.Versioning,Version=6.0.0.278,Culture=neutral,PublicKeyToken=31bf3856ad364e35'---> System.IO.FileLoadException:无法加载文件或程序集'NuGet.Versioning,Version=6.0.0.280,Culture =中性,PublicKeyToken=31bf3856ad364e35'。在 System.Runtime.Loader.AssemblyLoadContext.LoadFromPath(IntPtr ptrNativeAssemblyLoadContext, String ilPath, String niPath, ObjectHandleOnStack retAssembly) 在 System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyPath(String assemblyPath) 在 Microsoft.Build.Shared.MSBuildLoadContext.Load(AssemblyName assemblyName ) 在 System.Runtime.Loader.AssemblyLoadContext.ResolveUsingLoad(AssemblyName assemblyName) 在 System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName) 在 Microsoft.Build.NuGetSdkResolver.NuGetSdkResolver。

有人知道缺少什么吗?