CleanArchitecture:将可以通过 EF 存储的 View 相关数据放在哪里?

CleanArchitecture: where to put View-related data that can be stored via EF?

我的问题很简单,但在细节上有点复杂!我试着解释一下...

我以 'Clean Architecture' 的方式构建我的应用程序,其中我在最顶层有实体(不要与数据库实体混淆)。它们只代表特定领域的数据(所以基本上 getters/setters + 很少的验证逻辑 + 业务规则)。下面的层称为 'Application',我在其中处理所有传入请求,有时来自 API,有时来自 Web 应用程序等。这些请求可能导致 CRUD - 指向数据库的操作(不是必须的)。为此,我发明了一个名为 Infrastructure 的第三层,我在其中使用 EF 从实体(在实体层中)映射到数据库实体。目前还好...

现在我有一个 Web 应用程序需要在 canvas 上显示一些视觉元素(例如)。这些视觉元素应该能够显示一些描述性文本并代表实体层中特定实体的状态。我已经编写了 ViewModels/DTOs,它只是映射到该实体以响应传入请求并保持松散耦合。现在要求我必须使这些视觉元素在屏幕上可调(通过鼠标 + 拖放)并保持这些调整(使用坐标)。

现在我的简单问题是: 这些坐标应该放在哪里? 将它们放入 Entities - 层中的 Entity 在我看来是错误的,因为永远不应该有任何状态对应于 View 的视觉效果。

我需要通过 EF 存储这些坐标,所以我需要一个模型来映射,为此我使用了我的实体。

配置如下:

public class SpotConfiguration : IEntityTypeConfiguration<Spot>
{
    public void Configure(EntityTypeBuilder<Spot> builder)
    {
        if (builder == null) 
            throw new ArgumentNullException(nameof(builder));                    

        builder.HasOne(x => x.Area)
            .WithMany(x => x.Spots)
            .HasForeignKey(x => x.AreaId);

        builder.Property(x => x.Description)
            .IsRequired()
            .HasMaxLength(10);      
    }
}

Spot是需要引用坐标的Entity。只有一个 Web 应用程序需要坐标,但实体也用于其他域!

希望你能理解我的问题! :)

禁止将 view-state 发送到实体层是为了防止您让您的实体知道它们是如何显示的。您对 UI 元素的调整创建了一种全新的实体,需要自己的 persistence/domain 层。

您应该努力使这些新元素与您的域实体强烈分离。它实际上是一个全新的域,恰好在某处绑定到您的视图模型(不是域实体)。

您的 view-models 即将证明自己的价值!它们将由 domain-entity 数据和处理布局配置位的点组成。这就是我们创建 view-models 的原因,这样我们就可以保持 domain-models 清洁这种东西。