问题标签 [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 投票
2 回答
499 浏览

.net - 是静态工厂在 codecampserver 中一个众所周知的模式?

CodeCampServer 源代码包含一个通用的StaticFactory

我推测这是框架如何与依赖注入良好配合的机制的关键部分。

其子类使用它的 DefaultUnconfiguredState 来提供对它们自己的默认未配置状态的静态访问,依赖解决机制可以用工作的东西代替它。

我找不到任何有关此的文档...

上有很好的解释吗?(我正在等待亚马逊的送货......)

...或者其他人可以提供一个很好的评论这是什么以及我是否明智地采用这种模式(如果它是一个......)?

更新

由于 Jeffrey Palermo 回答了这个问题,我看到在 MVC2 in Action 的(正在进行的)手稿中,使用用于定位存储库以保持域层无知的工厂讨论和说明了这种模式/风格持久性问题。(见第 23 章)。

默认情况下,使用此工厂会引发异常:

“如何创建存储库的知识不属于工厂。这个工厂仅代表返回存储库的能力”

该示例可以使用几种机制之一来初始化存储库接口的具体实现。在书中的示例中,为了简单起见,他们选择不使用 IOC 容器,并在某些启动逻辑中明确提供它。

“重要的是,核心项目和 UI 项目都不应引用基础设施项目或本质上纯粹是基础设施的库。我们将 NHibernate 完全放在一边,这样应用程序的其余部分就不会关心数据访问正在发生”

关于这一新章节中示例代码的最后一点要注意的是,工厂不再是静态的(至少就面向外部的接口而言不是)。

更新 2

巴勒莫先生在博客上写了更多关于这种特殊风格的抽象工厂(参见 OrderShipperFactory 的实现)。

我也可以考虑“手动依赖注入”(鲍勃叔叔)。

更新 3 - 2016 年 3 月

这里还有另一个例子,尽管 Jeffrey 明确表示这是演示代码,并且注释表明这将在 Mark Seeman 所称的组合根中进行配置(即在应用程序启动时)

我在 Jeffrey 的文章“洋葱架构:第 4 部分 - 四年后”中发现了这一点

0 投票
3 回答
7796 浏览

asp.net-mvc - 同一层的洋葱架构依赖关系:基础架构和 Web 通信

我正在使用Jeffrey Palermo 描述的Onion Architecture设计一个 ASP.NET MVC 应用程序。

这是一个 ASP.NET MVC 2.0 项目,我要求使用专用视图模型对所有视图进行强类型化——我们不会将域模型传递给我们的视图。我们正在使用 AutoMapper 进行翻译——AutoMapper 在基础设施中是孤立的,Web 不知道也不关心 AutoMapper 正在被使用。

目前,我正在 Web 项目中定义 IViewModelMapping 接口——仅仅是因为该服务将由控制器使用,并且它可以直接访问自己的视图模型。通过这种方式,界面可以访问域模型(在核心中)和视图模型(在 Web 中)。

为了提供 IViewModelMapping 接口的实际实现,我在 Infrastructure 项目中创建了一个 ObjectMapping 命名空间,它将实际映射实现隔离到 onion 的 Intrastructure。为此,这将要求基础架构同时依赖于核心和 Web。

我的问题是:因为这两个项目在技术上都位于洋葱的郊区(在同一层)——是否允许一个项目依赖于该层中的另一个项目?有没有人注意到这种设计有任何潜在的缺陷?

另一种设计是将 IViewMapper 接口移动到 Core 中——但这是不可能的,因为 Core 无权访问 ViewModel 类。我也可以将视图模型移动到 Core,但我觉得它们不属于那里,因为它们特定于 UI 层。

提议的架构如下——注意基础设施依赖于Core AND Web。Web 保持隔离,只能访问核心业务逻辑。

http://www.matthidinger.com/images/onion-arch.png

0 投票
3 回答
8532 浏览

c# - DDD和“洋葱架构”是什么关系?

领域驱动设计(DDD) 与Jeffrey Palermo的“洋葱架构”有什么关系?

0 投票
1 回答
670 浏览

linq-to-sql - 关于使用 Onion 架构过滤数据和代码重用的建议

以下是我的问题,然后我将为您介绍这些问题的背景:

  • 我更喜欢使用方法 2 作为我的应用程序设计,那么有没有办法像方法 1 一样提供过滤,而不引入对非业务代码的引用,也不允许访问 Core 项目中的数据库模型?

  • 你如何处理代码重用?每个对象的命名空间类似于 Project.Core.Domain 或 Project.Core.Services,但如果将命名空间设置为类似于 CompanyName.Core.Domain 之类的名称,那么当它未存储在该项目中时,会感到很奇怪。目前,我正在复制源代码文件并重命名命名空间来处理这个问题,但我想知道是否有一种组织方式来处理这个问题或者我没有想到的其他东西?

我正在使用的技术:

  • ASP.NET MVC 3
  • Linq 到 SQL
  • 结构图
  • 起订量
  • 测试

方法一:


以下是我用来设置 Web 项目的方式: 在此处输入图像描述

Data 项目将包含所有存储库和 Linq 数据上下文。在存储库中,我将使用 IQueryable 从数据库中返回一组对象。

这使我可以设置静态方法的过滤器。这些也存储在数据项目中。

在服务层,可以像这样应用过滤器。

因此,存储库只需提供一个 ListAll 方法,将所有项目作为 IQueryable 对象返回,然后服务层将确定如何在返回数据子集之前对其进行过滤。

我喜欢这种方法,它使我的存储库更干净,同时将大部分代码留在了服务中。

方法二


以下是我目前设置 Web 项目的方式: 在此处输入图像描述

使用洋葱架构:

  • 核心:包含业务领域模型、应用程序的所有接口和服务类实现。
  • 基础设施:包含存储库实现、Linq 数据上下文和映射类,以将 Linq 数据库模型映射到业务模型。

由于我将业务代码与数据库代码分开,因此我不想在 Core 项目中添加对 Linq 之类的引用来访问 IQueryable。所以,我不得不在存储层执行过滤,将数据库模型映射到域模型,然后将域对象的集合返回给服务层。这可以将其他方法添加到我的存储库中。

0 投票
2 回答
11278 浏览

c# - 洋葱架构

我正在为即将推出的内部应用程序建立一个项目结构,以试用 Palermo 提出的 Onion Architecture ( http://jeffreypalermo.com/blog/the-onion-architecture-part-3/ )。

我遵循了他的指导方针,但是到目前为止我需要对项目的结构进行一些验证。

在图表之前,问题:

  1. 我认为参考资料都是正确的(根据图表设置,其中箭头表示“有参考资料”),但进行一些验证会很好。

  2. 我应该在我的依赖解析层中添加什么?这是Helper去的地方吗?这对所有其他项目都有参考吗?

  3. Web 服务和 UI 如何与 DAL 通信?(通过核心?如何?)

  4. 应该去哪里?[我知道的广泛问题...]

简化概念图如下(文件夹代表命名空间):

在此处输入图像描述 在此处输入图像描述

0 投票
1 回答
1330 浏览

design-patterns - 洋葱架构:将工厂实现放在哪里?

我来构建新的“企业解决方案”

所以我决定使用“洋葱架构”,因为我想要灵活的架构。

但我是“依赖解决”问题的新手。

据我了解,我应该将工厂“实现”放在该层中,并且该层具有对所有其他层的引用。

然后我想知道当DependencyResolution 层和 UI 层中的 FactoryImplementation没有引用“DependencyResolution 层”时,如何在“ UI 层”中创建IFactory的新实例


编辑::

感谢埃里克先生

但是在我看到许多这些链接之后,当我想将实现“注册”到他们的“接口”时仍然遇到问题,因为我不能在 UI 项目中做这样的事情:

因为 UI 项目无法访问TaxCalculator“实施”。

0 投票
1 回答
854 浏览

c# - DI容器中的洋葱架构和注册依赖

我一直在阅读 Onion 架构,我有一个简单的问题,即应如何安排程序集依赖项以使 DI 容器能够连接所有内容。

假设一个非常简单的解决方案具有以下结构:

UI => BL <= DAL

所以 UI 和 DAL 引用了 BL,但互不了解。

还假设 BL 有一个名为 IDatabaseService 的接口,该接口由 DALDatabaseService 在 DAL 中实现。

容器将(可能)在 UI 的入口点中配置。既然 UI 不知道 DAL,那它怎么注册 IDatabaseService 来解析为 DALDatabaseService 呢?

0 投票
3 回答
1936 浏览

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

这几天我一直在研究洋葱架构。我了解依赖项应该始终朝向中心,以及如何使用依赖项注入来实现这一点。但是我有几个问题我仍然无法弄清楚。

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

    eg:一个Order实体有一个DeliveryCity通过Oder.DeliveryZip属性建立的关系,它不是外键,而是唯一的。为了得到城市的拉链,我必须打电话ICityRepository.FindByZip(zip)

    我的模型中有以下代码

    /li>
  2. 上面的代码会有什么问题?它应该改用域服务吗?

  3. 领域服务实现应该在核心层还是在基础设施层定义?

0 投票
1 回答
508 浏览

c# - 使用洋葱架构时将共享部分放在哪里?

我正在尝试应用 J. Palermo 的洋葱架构,但我有一些事情正在努力解决。

我有一些零件,但我不知道该放在哪里。

  • 我有一个插件引擎,它读取目录并确定要加载的内容
  • 有一些在多个项目中使用的带有翻译的资源文件。我应该把这些文件放在哪里?
  • 我有一些在整个系统中使用的属性。把这些放在哪里?
  • 我还有两个“基本”控制器,一些默认结果和视图。我应该把这些放在哪里?

所有这些项目都在几个项目中使用,所以我想把这些项目放在一个中心点。

我当前的解决方案结构如下所示:

  • Project.Core(包含存储库的域对象和接口)
  • Project.Infrastructure(是实现的核心)

我正在使用 MVC2。

0 投票
1 回答
3049 浏览

c# - 流畅的 NHibernate 和 NLog

我的流畅配置中出现了一些模糊的错误。我已经读过设置日志记录解决方案将帮助我解决这个问题。我想使用 NLog。我知道我需要使用 Common.Logging 2.0 和 NHibernate.IInterfaceLogger 来启动和运行它。我只是不知道如何把这些碎片放在一起。我的系统基于洋葱架构。我为 NLog 设置了我的日志记录服务,并且我有我的接口,但我只是有点困惑我应该在哪里将所有这些绑定在一起。我的数据项目中存在我的 Fluent NHibernate 配置。我假设我想在那里将所有这些绑定在一起。

对此的任何想法都会很棒!我有点失落!