标签: onion-architecture

DDD应用服务域模型查看模型映射

我对应用程序服务的理解是它们在域和用户界面之间进行链接.换句话说,它们为控制器提供服务以在域上执行操作.

我的应用程序中有以下项目布局:

  • 域核心
  • 基础设施
  • 服务接口
  • Web UI
    • 的ViewModels
    • 查看
    • 控制器
    • 服务(应用服务)

Service InterfacesWeb UI项目之外的谎言.然后在Web UIProject中我实现了服务接口Services.

然而,当我们将其付诸实践时,这种结构有点瑕疵并产生循环依赖.我试图在这个链接中遵循架构.https://www.develop.com/onionarchitecture

对于给定的服务,我想传入视图模型,基于视图模型对域执行操作,然后返回更新的视图模型.这种方法有误吗?

我的理解是否正确,应用程序服务本质上将视图模型作为参数,更新域中的一些细节并在需要时查看模型然后返回视图模型?

要么

应用程序服务是否仅将c#数据类型和域模型作为参数处理并返回相同的数据类型?换句话说,在视图模型中不获取或设置任何信息.实际上并不知道视图模型的存在.

我只需要澄清一下严格DDD方法的最佳方法.

architecture domain-driven-design onion-architecture ddd-service

8
推荐指数
1
解决办法
2152
查看次数

ASP.NET Core Identity ApplicationUser 与域模型实体关系的分离

我正在尝试在我的域模型中的 ASP.NET Core Identity 和实体之间实现良好的分离和架构。

我在使用 ASP.NET Core 构建的 Web 应用程序中使用洋葱架构。在核心项目中Domain,我有域模型,其中之一是Member实体。

然后在另一个项目中Infrastructure,我有内置的 ASP.NET Core Identity 设置,其中包含一个ApplicationUserIdentityUser.

    public class ApplicationUser : IdentityUser
    {
    }
Run Code Online (Sandbox Code Playgroud)

将身份用户和成员实体分开的想法很好。但是,我想将它们联系起来,但是使用 Entity Framework Core 这似乎是一个挑战。如果不在我的域模型中添加导航属性,我就无法解决这个问题,我想避免这种情况。

我希望我可以完全使用 Fluent API 来完成它,而不必添加属性,但情况似乎并非如此。

关于如何解决这个问题的任何建议?考虑到上述情况,如何在不添加核心项目依赖项的情况下在身份用户和域实体之间创建关系?

我的问题有点重复或与这里的一些帖子有关,例如

以及其他一些帖子。然而,这些问题的答案似乎是变通方法。也许这是唯一的方法?

我正在使用 ASP.NET Core 3.1 和 Entity Framework 3.1。对于这个项目。

c# onion-architecture asp.net-identity entity-framework-core asp.net-core

8
推荐指数
1
解决办法
2387
查看次数

如何在洋葱架构上实现服务和存储库?

我一直在研究洋葱建筑学几天.我知道依赖关系应始终走向中心,以及如何使用依赖注入来实现这一目标.但我还有几个问题我仍然无法弄清楚.

  1. 模型(或实体)可以引用存储库接口或服务接口吗?

    例如:Order实体具有DeliveryCity通过Oder.DeliveryZip属性建立的关系,该关系不是外键,而是唯一的.要获得拉链的城市,我必须打电话ICityRepository.FindByZip(zip)

    我的模型中有以下代码

    class Order
    { 
        . . .
    
        [Inject]
        public ICityRepository CityRepository { get; set; }
    
        private City _dCity;
    
        public City DeliveryCity {
            get {
                if (_dCity == null)
                    _dCity = this.CityRepository.FindByZip(this.DeliveryZip);
    
                return _dCity;
            }
        }
        . . .
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 上述代码会出现什么问题?它应该使用域名服务吗?

  3. 域服务实现应该在核心内部还是在基础架构层中定义?

.net domain-driven-design ddd-repositories onion-architecture ddd-service

7
推荐指数
2
解决办法
1837
查看次数

在洋葱建筑中放置视图模型/ DTO

我目前正在重构ASP.NET MVC项目以使用洋葱arcitecture,因为它似乎适合未来发展的需要.

我已经设置了我认为需要使用的图层,我的解决方案现在看起来像这样:

在此输入图像描述

所以,基本上我已经理解,该ClientName.Core项目根本不应该参考其他项目.本ClientName.Infrastructure应具有的一个参考ClientName.Core.Interfaces文件夹ClientName.Core定义项目中的服务,ClientName.Infrastructure我的DbContext和域实体是分开的,因此只有实体在核心项目中.

我把头靠在墙上的是,ClientName.Infrastructure项目不应该将域实体返回到调用它的客户端.这将在核心项目和任何"违反"洋葱原则的UI之间创建引用.正如我所读到的,解决这个问题的方法是让基础设施服务返回DTO.但是,如果我PersonDtoPersonService类中返回ie PersonDto,则ClientName.Core项目需要知道该对象,因为这是接口所在的位置.

所以问题是:我在哪里放置DTO/ViewModel /用于UI /客户端的其他模型?我是否创建了一个单独的类库来保存这些模型,并让UI,基础结构和核心项目都引用它?

非常感谢任何帮助/提示,​​因为我对此有点困惑;-)

提前致谢.

编辑

根据Euphorics的回答,我在这里编写示例代码只是为了检查我是否正确,可能还有一些后续问题.

所以基本上,在我的ClientName.Core层中,我有我的实体,其中包含业务逻辑,即a PersonFirm实体可能如下所示:

(Exists in ClientName.Core/Entities)
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }   
    public Firm Firm { get; set; }
}

(Exists in ClientName.Core/Entities)
Public class Firm
{
    public int Id …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework onion-architecture

7
推荐指数
1
解决办法
2952
查看次数

DDD 工厂实体值对象

在我当前的项目中,我越来越多地采用 DDD/洋葱架构。我仍然不清楚的许多事情之一是应该有多少封装。用一个具体的例子更容易解释。

例子

namespace MyProject.Model
{
    public class ComplexEntity
    {
        private int _id;
        public int Id { get {return _id;} }
        public ValueObjectA ValueA {get; set;}
        public bool IsBool {get; set;}
        public ComplexEntity(ValueObjectA a, bool isBool)
        {
            // Do some validation first
            ValueA = a;
            ValueB = b;
            IsBool = isBool;
        }
    }

    public class ValueObjectA
    {
        public bool IsBoolA {get; private set;}
        public bool IsBoolB {get; private set;}
        public ValueObjectA(bool a, bool b)
        {
            IsBoolA = a;
            IsBoolB = …
Run Code Online (Sandbox Code Playgroud)

c# domain-driven-design factory onion-architecture

6
推荐指数
1
解决办法
2029
查看次数

洋葱架构:我们应该在域实体中允许数据注释吗?

我希望将Onion Architecture实现到我们的ASP.NET MVC应用程序中.我理解将视图模型与域实体分开的必要性,但我发现自己正在编写冗余代码.存在冗余代码,因为我的视图模型和域实体看起来完全相同,除了我的视图模型具有[Serializable]数据注释.我需要这些模型可序列化,因为我使用的是ASP.NET会话状态,其中State Server需要对象可以序列化.

我个人觉得域实体不应该是可序列化的,因为它会依赖于特定的技术.但是,如何避免冗余代码?

我应该补充一点,我的服务方法依赖于这些可序列化的数据模型.

c# asp.net-mvc serialization domain-driven-design onion-architecture

6
推荐指数
1
解决办法
1014
查看次数

洋葱架构标识框架

我正在关注洋葱架构。并且我正在使用 ASP.NET Identity Framework。

这是我的项目结构:

1-Core
     - Domain Classes //It contains my T4 template classes
          -- AppUser  //It is Identity User.  
     - Repository Interfaces
     - Service Interfaces
2-Infrastructure
     - Data //It contains my edmx file, I am using Db First approach.
     - Dependency Injection
     - Repository Interfaces Implementation
     - Service Interfaces Implementation
3-WebApi
     - Web Api Project
4-WebClient
     - My AngularJs App
5-Test
     - Test Project
Run Code Online (Sandbox Code Playgroud)

我已经复制了 ASP.NET Identity 表的脚本并在我的 SQL Server 上执行。它为我创建了身份表。

在我的Infrastructure.Data项目中,我创建了一个Edmx File …

.net asp.net onion-architecture asp.net-web-api asp.net-identity

6
推荐指数
1
解决办法
2300
查看次数

您是否应该为每个有界上下文设置一个数据库到规则 - 所有设置或分离数据库?

在DDD中,据我所知,它可以帮助或指导您如何构建复杂的应用程序.现在在应用程序中,您应该识别您的有界上下文.假设您有超过10个BC.

我在某处阅读(原谅我,我不能给出任何链接),对于复杂的应用程序来说,拥有一个大数据库是不理想的.它应该为每个BC分开.如果这是更容易的路线.如果每个BC都有自己的数据库,应如何构建应用程序.

我尝试在github上搜索但找不到.

c# domain-driven-design onion-architecture

6
推荐指数
3
解决办法
301
查看次数

在分层架构中,应用程序层如何了解Web URL?

我目前正在开发一个使用分层架构(Web /应用程序/基础设施/域)的.NET 5应用程序。如果我要遵循洋葱/干净架构模式,依赖关系应该仅朝一个方向流动,例如:

Web -> 应用程序 -> 基础设施 -> 域

我现在发现自己需要从应用程序层发送几封包含特定前端 URL 的电子邮件。这意味着应用程序层将了解 Web 层,从而打破依赖流。

示例用例流程如下:

  1. 用户发出请求,由 Web 层的控制器处理
  2. 控制器调用应用程序层的处理程序
  3. 应用程序层使用基础设施层的电子邮件服务发送电子邮件

在步骤 #3 中,我位于应用程序层,但需要 Web URL 来构建电子邮件正文。

我该如何解决这个问题?

.net c# onion-architecture clean-architecture .net-5

6
推荐指数
1
解决办法
829
查看次数

我应该将 Excel/PDF 生成器类或函数放在 Onion/Clean Architecture 中的哪里?

我想在 dotnet core 6 的新解决方案中添加 Excel 和 PDF 生成器。我遵循此模板: https: //github.com/iammukeshm/CleanArchitecture.WebApi

或者

https://codewithmukesh.com/blog/onion-architecture-in-aspnet-core/#Getting_Started_with_Onion_Architecture

这对于 dotnet core 来说确实是一个非常好的干净架构教程。根据我的理解,Excel Generator 或 PDF Generator 将放置在Application/Features

例如,下载 Excel 文件中的发票报告,因此路径为

Solution
|- Application
    |- Features
        |- InvoiceFeature
            |- Commands
            |- Queries
            |- Generates
                 |- GenerateInvoiceByDateRangeInExcel.cs
Run Code Online (Sandbox Code Playgroud)

我将controllers添加

Solution
|- Application
    |- Features
        |- InvoiceFeature
            |- Commands
            |- Queries
            |- Generates
                 |- GenerateInvoiceByDateRangeInExcel.cs
Run Code Online (Sandbox Code Playgroud)

老实说,我不会先尝试这个想法,所以回到我的问题

我应该将 Excel/PDF 生成器类或函数放在 Onion/Clean Architecture 中的哪里?以及如何使用 Mediatr 正确使用它

c# excel onion-architecture .net-core clean-architecture

6
推荐指数
0
解决办法
338
查看次数