问题标签 [onion-architecture]

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 投票
1 回答
375 浏览

.net - 洋葱架构的 Windows 服务

我见过的所有洋葱架构示例都在 ASP.NET MVC 应用程序的上下文中。他们倾向于通过将 IoC 设置放在基础结构 DLL 中并使用一些魔法(HttpModule 或 WebActivator)使 IIS 在正确的时间执行该设置代码来避免 UI 和服务实现(基础结构)之间的直接引用。

就我而言,我正在开发一个 Windows (TopShelf) 服务,并且正在努力解决如何使服务控制项目与基础设施项目完全分离。没有像在 IIS Web 应用程序中那样挂钩的执行管道。

我能想到的最好的方法是让服务项目扫描 IoC 注册表/模块类的 DLL,但这似乎仍然不那么干净。

有任何想法吗?

0 投票
1 回答
489 浏览

domain-driven-design - 这个 LocalizationService 类应该在具有洋葱架构的 DDD 中

我正在尝试使用 Onion Architecture 学习 DDD,但遇到了一个问题
我的应用程序应该支持标签、枚举、验证消息和某些实体中的某些数据(例如 Item.ItemName)
的本地化因此,很明显本地化过程与域和 ui
这个本地化服务也应该支持缓存
现在我很困惑我应该把这个类放在哪里

0 投票
1 回答
1293 浏览

asp.net-mvc - 在我的域模型中有数据库上下文是否可以

我正在使用 ASP.NET MVC 开发一个基于 Web 的应用程序。我正在尝试拥有丰富的域模型而不是瘦/贫血模型。

我已经按照 Onion 架构对我的解决方案进行了建模。不同的项目如下: 在此处输入图像描述

  • {}.Domain.Core - 包含域对象和接口,例如在基础设施层实现的 IDbContext
  • {}.Database - 是数据库项目
  • {].Infrastructure - 包含日志记录、数据访问等的实现。
  • {}.Web - 视图和控制器

**** 数据访问是使用 dapper 完成的,IDbContext 是围绕 2 个简单命令、查询接口的包装器。我已将每个查询隔离为单独的类。

为了便于讨论,我只取了应用程序的一小部分。

我有一个版本化的文档库,其中包含文档以及标签、权限等其他元数据

我的文档对象的简化模型如下所示

在此处输入图像描述

我希望在域对象中定义操作,因为每个操作都涉及业务逻辑。让我把“删除”作为一个操作。需要执行的操作

  • 验证用户是否有删除权限
  • 检查是否没有会受到此删除影响的关联
  • 检查是否没有正在进行的工作流
  • 在事务中从数据库中删除实际项目

如上例所示,我需要数据库上下文来完成此操作。我目前考虑的方式是建模是否让域对象具有 IDbContext,它可以执行公开的查询。

在此处输入图像描述

在我的控制器类中,我调用域对象并执行操作。

我不确定在域对象中传递 IDbContext 是否可以?如果不是,有什么更好的建模方法?

我不相信有一个单独的服务层,因为 1) 在大多数情况下,控制器充当服务层的第一层 2) 服务层只是将相同的方法从域复制到另一个类

让我知道如何改进这个设计。

0 投票
3 回答
4829 浏览

.net - 将 ASP.NET 身份与核心域模型解耦 - 洋葱架构

我正在使用这个示例项目(https://github.com/imranbaloch/ASPNETIdentityWithOnion)作为我的应用程序架构,在这个示例中,核心完全从包括身份框架在内的基础设施中分离出来。

在这个示例中,作者使用了适配器模式来解耦核心身份类(IdentityUser、IdentityRole ...),并在核心层中提供类似的类。

现在这个示例项目中的问题是域模型(产品、图像)没有与模仿身份的虚拟类(AppUser、ApplicationRole、AppliationUserRoles...)链接。

然后我修改了代码以添加对 AppUser 的引用

如果我将“AppUser”导航属性放在“Image”类中,则创建的数据库将有四个新表,而不是身份框架的默认五个表。

身份表的洋葱数据库问题

我需要将这些表合并到默认表中。如何 ?

编辑:

这是驻留在数据层中的身份模型(我无法从核心中引用)。

这也是我在 OnModelCreating 方法中的模型构建器:

0 投票
1 回答
620 浏览

asp.net-mvc - 在洋葱架构中使用角色授权

大家好

我有一个使用 ASP.NET Identity 2.0 的项目。在这个项目中,我遵循洋葱架构。这些层是:

1.UI:没有引用 Owin 或 ASP.Net Identity

2.AuthenticationService:包含asp.net身份usermanager的包装器。这个包装器实现了一个位于Bal层的接口。这个层还包含我的自定义UserStore。

3.Dal:DbContext 就在这里。

4.Bal:包含 Domaine 实体和接口。不引用 Owin 或 ASP.NET 标识或其他任何内容。

5.DependencyResolver:Owin Startup 在这里加上一些 Ninject 模块和 NinjectWebCommon。所以我正在使用 Ninject。

直到现在一切都很好。用户很高兴创建帐户,并且他们可以随时登录/注销/管理。现在面临的问题是授权(Role="rolename")。它只是不起作用。

这两个作品

这是一个没有。

在我的数据库中,我有属于角色管理员的用户。我不确定为什么这不起作用。mybe 因为我将所有身份验证内容移到另一层,所以 IPrincipal.IsInRole(string role) 无法弄清楚如何再检查一下。

正在创建自定义 Authorize 属性或创建一些扩展。但我决定先征求你的意见。

感谢您的时间

0 投票
2 回答
198 浏览

architecture - 外部设备逻辑在域驱动设计中属于哪里?

我正在尝试从更多领域驱动的角度开发一个新项目,虽然我主要了解这些原则,但仍有一些事情暗示了我。

我的领域需要与外部设备交互,因此我需要为设备发现、模型创建和一定程度的通信定义接口。

像上面这样的东西是否属于核心域,或者从域驱动的角度来看,这样的东西(它有助于我的域但不是我的域本身)完全位于域之外并使用域中定义的行为来完成工作?

为了添加更多信息,我目前的架构建模如下:

0 投票
1 回答
997 浏览

c# - 重构为领域驱动设计

我有一个场景正在尝试重构为 DDD。我有一个 Batch,它是 BatchEntries 的聚合和列表。创建 Batch 并添加 BatchEntries 后,将向该批次中的个人发送一条 SMS,并且该批次的状态从运行变为已发布。

关于如何使设计更好的任何想法?该域有两个聚合 Batch 和 BatchEntry,其中 Batch 是聚合根。

代码看起来像这样

域和域服务通过应用程序服务公开。应用服务中的代码如下:

问题:

  1. BatchStatus 即 Running、Posted 应该分配在哪里?
  2. MarkBatchAsPosted 方法是否应该定义为批处理实体中的方法?
  3. 对于领域驱动设计,如何最好地重新设计?
0 投票
0 回答
225 浏览

c# - 具有 I18N 数据库驱动的国际化的洋葱架构

我在任何地方都找不到答案,所以我想我会发布一个关于它的问题。

我已经按照本教程ASP.NET MVC 5 Internationalization · How to Store Strings in a Database or Xml

现在这很好,我可以让它工作。

现在的问题是,如何正确地将其合并到Onion Architecture中。

本教程有一个Resource项目。这仍然有效还是可以抽象出来?

只是没有一个很好的教程来介绍如何将国际化整合到 Onion 架构中。

到目前为止,我所拥有的是:

  • 包含 {Name, Culture, Type, Value} 的数据库表(资源)
  • 实体称为Resource
  • 名为“IResourceRepository”的接口(GetResources()、GetResource(Culture,Name))
  • 我有一个服务接口和一个服务,它也具有与存储库相同的方法来获取资源。

这是我第一次设置一个全新的 Web 应用程序,并且最近才了解 Onion 架构。任何帮助将不胜感激。

更新

这是我的部分尝试。

纠正我如果我错了请。

  • 应用程序域实体
    • Resource.cs(名称、文化、类型、值)
  • App.Domain.Interfaces
    • IResourceRepository.cs (GetResources(), GetResource(Culture, Name))
  • App.Infrastructure.Data
    • ResourceRepository.cs (GetResources(), GetResource(Culture, Name))
  • 应用程序服务接口
    • IResourceService.cs (object GetResource(Culture, Name))
  • 应用程序.Web.UI.服务
    • BaseResourceService.cs(实现 IResourceService.cs)
    • ResourceService.cs(扩展 BaseResourceService.cs)

这就是我到目前为止的方式。所以Resource包含了针对不同文化的一大堆资源。

很确定'n做错了什么。

0 投票
1 回答
303 浏览

asp.net-mvc - Onion 架构访问目录和应用程序数据库

我有点卡在洋葱架构上。

假设我正在开发一个应用程序,用户可以在其中注册帐户、登录并维护他们的帐户(例如更改电话号码)。

然而,当他们登录时,他们可以做其他应用程序的事情(例如创建产品、添加博客条目、发送带有照片的消息等......)

我正在努力定义业务逻辑,这就是原因。

所有应用程序服务都保存到Postgresql数据库中。

所有用户管理功能和登录到他们的帐户都由LDAP 389 Directory Server. 我将使用该Novell.Directory.Ldap软件包,因为它将在单声道上运行并且尚不支持System.DirectoryServices.Protocols

应用程序数据库和目录服务器都有唯一的表。

我是否将应用程序数据库实体和 LDAP 目录服务模型都放在 App.Domain.Entities 中?

从技术上讲,我有 2 种不同类型的数据库和不同类型的模型。

不完全确定如何处理这个问题。

我的解决方案结构:

  • 领域
    • 应用程序域实体
    • App.Domain.Interfaces
  • 基础设施
    • App.Infrastructure.Data (FluentNHibernate)
    • App.Infrastructure.DependecyResulution (SimpleInjector)
    • App.Infrastructure.Interfaces
    • App.Infrastructure.Logging (NLog)
    • App.Infrastructure.LDAP (Novel.Directory.Ldap)
  • 服务
    • 应用程序服务接口
  • 网络
    • App.Web.UI(ASP.NET MVC 4 剃刀)

我很确定我做错了。有人可以用某种伪示例指出我正确的方向吗?例如模型去哪里等。

先感谢您

0 投票
3 回答
8348 浏览

domain-driven-design - 日志记录应该在 DDD 的洋葱架构中进行

我正在使用洋葱架构和域驱动设计开发控制台应用程序。我有两个域,我需要在其中实现日志记录,我很困惑我可以在哪里放置日志记录组件。我可以把它放在两个域的各自基础设施中吗?或者在可以在两个域中引用的共享内核中?如果我需要将它放在共享内核中,我应该遵循什么结构?我的意思是像核心,基础设施。