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

entity-framework - 对基于 ASP.NET MVC Onion 架构的看法

您对以下“通用”代码优先洋葱启发的 ASP.NET MVC 架构有何看法: 解决方案资源管理器的屏幕截图

层,解释:

核心- 包含领域模型。例如,这就是业务对象及其关系。我正在使用实体框架来直观地设计实体及其之间的关系。它让我为数据库生成一个脚本。我得到了自动生成的类似 POCO 的模型,我可以在下一层(持久性)中自由地引用它们,因为它们很简单(即它们不是特定于数据库的)。

持久性- 存储库接口和实现。基本上是域模型上的 CRUD 操作。

BusinessServices - 存储库周围的业务层。所有的业务逻辑都应该在这里(例如GetLargestTeam(),等等)。使用 CRUD 操作来组合返回对象或获取/过滤/存储数据。应包含所有业务规则和验证。

Web(或任何其他 UI) ——在这种特殊情况下,它是一个 MVC 应用程序,但该项目背后的想法是提供 UI,由业务服务提供的驱动。UI 项目使用业务层并且无法直接访问存储库。MVC 项目有自己的 View 模型,它们特定于每个 View 情况。我不是想强制喂它领域模型。

所以引用是这样的: UI -> 业务服务 -> 存储库 -> 核心对象

我喜欢它的地方:

  • 我可以设计我的对象,而不是手动编码。我正在获取代码生成的模型对象。
  • UI 由业务层驱动/强制执行。不同的 UI 应用程序可以针对相同的业务模型进行编码。

百感交集:

  • 好吧,我们有一个可插入的存储库实现,但是你真的多久有一次相同持久性接口的不同实现?
  • UI 也是如此——我们拥有针对相同业务规则实现不同 UI 应用程序的技术能力,但是当我们可以简单地呈现不同的视图(移动设备、桌面设备等)时,我们为什么要这样做呢?
  • 我不确定 UI 是否应该只通过视图模型与业务层通信,或者我应该像现在一样使用域模型来传输数据。对于显示,我使用视图模型,但对于数据传输,我使用域模型。错误的?

我不喜欢的:

  • 现在在所有其他项目中都引用了核心项目 - 因为我想要/必须访问域模型。在经典的 Onion 架构中,核心仅被下一层引用。
  • DbContext 是在 .Core 项目中实现的,因为它是由实体框架生成的,位于 .edmx 所在的相同位置。我实际上想使用 .EDMX 进行可视化模型设计,但我觉得 DbContext 属于 Persistence 层,位于特定于数据库的存储库实现中的某个位置。

作为最后一个问题 - 什么是一个没有过度设计的好架构(例如成熟的洋葱,我们有注入,服务定位器等),但同时在你会的地方提供了一些合理的灵活性真的需要吗?

谢谢

0 投票
2 回答
594 浏览

asp.net-mvc-4 - 我们是否应该在 Onion 架构中公开 IDataContext

在 ASP.NET MVC 中实现 Onion 架构时,我的理解是我们应该/可以公开 IDataContext 接口,该接口可以在 UI 中注入和引用。

所以基本上在 ASP.NET MVC 中,我们可以这样做:

那不是让 UI 层实现业务逻辑吗?我相信 Onion 的基本理念之一是它可以清楚地了解哪些代码进入了哪些层,并明确禁止 UI 层实现业务逻辑。

如果我们将存储暴露给 UI(有或没有SaveChanges能力),我们让 UI 开发人员实现自定义业务逻辑。

这可以通过仅通过诸如此类的域服务将所有操作暴露给底层 IDataContext 来“修复

用一句话总结我的问题:

我们应该允许 UI 层接触 IDataContext 还是应该只通过域服务公开所有上下文操作?如果我们公开 IDataContext,是否也可以公开在 IDataContext 中定义的 SaveChanges 方法(例如在实际的 EfDataContext 中实现)?

我认为 IDataContext 应该公开为只读(即没有 SaveChanges 功能),用于查询目的,而 C_UD 方法应该公开为域服务。对还是错?

0 投票
1 回答
120 浏览

c# - 转换为 IoC,如何处理内部对象

我在这里查看了许多线程(也许我使用了错误的术语),但我正在将 Web 应用程序转换为通过 NInject 使用 IoC。我的其他 IoC 项目相当小,所以这不是一个大问题,但是对于以下情况,推荐的做法是什么......

我的对象的结构看起来像这样......

城市是它自己的对象...

现在我一直在处理不可避免的“对象为空”异常,如下所示......

这对于较小的项目来说很好......但是现在我们正在谈论更大的事情,它变成了一件真正的苦差事。(向我的对象添加另一个对象,这可能意味着我需要在 100 多个地方执行此操作,假设我找到了它们)

在国际奥委会之前,这很容易通过做这样的事情来处理......

我想弄清楚(也许我只是在我读过的指南中完全错过了这个细节)是如何以优雅的方式在 IoC 中做同样的事情?

我所遵循的结构基于 Tony Sneed 在http://www.develop.com/onionarchitecture上提出的结构

唯一显着的区别是我的服务级别还没有任何东西,因为我们的大部分东西只是从数据库中读取/写入数据库,两者之间几乎没有显着的操作。(我可能需要在服务级别添加一些东西,但还没有完成,仍然不完全清楚该级别与存储库的确切属于什么。)

让我知道是否有更多细节可以提供帮助(IoC 工作正常,我只需要解决上述问题以保持合理的可维护性)

0 投票
2 回答
5305 浏览

asp.net-mvc - 洋葱架构:业务服务接口和实现

我正在学习洋葱架构。我对服务层有一个困惑,因为我看到有人说核心层应该只包含:

  • 楷模
  • 存储库接口
  • 服务接口

但其他人表示它也应该实现服务接口。那么应该在哪一层实现服务接口呢?

我认为基础设施层应该实现:

  • 存储库接口
  • 服务接口

并在请求时将它们注入 UI 层和测试层。

谢谢!

0 投票
1 回答
362 浏览

design-patterns - Onion Architecture - 模型服务可以引用另一个模型服务吗?

我正在开发一个遵循 Onion 架构的 ASP.NET MVC 应用程序。
我想知道Core中的ModelServices可以引用另一个ModelService吗?

ModelServices 是具体的实现,不继承任何接口。我在模型服务中编写业务逻辑,它依赖于存储库。

我做对了吗?

0 投票
2 回答
3461 浏览

entity-framework-5 - Onion Architecture - 实体框架代码优先模型 DataAnnotations

我正在开发一个遵循 Onion 架构的 ASP.NET MVC 项目。我已经在我的核心项目中添加了模型,这些模型将被称为基础设施项目中实体框架模型的 POCO 类。

我的问题是如何添加取决于实体框架的数据注释?

我可以将核心模型作为接口并在基础设施项目中继承并进行实际实施吗?

0 投票
3 回答
4739 浏览

asp.net-mvc - Onion Architecture - Service Layer Responsibility

I am learning Onion Architecture by Jeffrey Palermo for more than 2 weeks now. I have created a test project by following this tutorial. While studying I came across this question on SO. According to accepted answer, one person nwang suggests that Methods like GetProductsByCategoryId should not be in Repository and one the other hand Dennis Traub suggests that it is the responsibility of the Repository. What I am doing is :

I have a General Repository in Domain.Interface in which I have a method Find :

Then I created a BaseRepository in Infrastucture.Data:

And I have a concrete repository in Infrastructure.Data

Now what I am doing in my Service Layer is Injecting Repository into Service and calling Repository.Find for methods like GetProductsByCategoryId. Like :

0 投票
1 回答
190 浏览

asp.net-mvc-4 - 需要有关在 n-teir 应用程序中使用存储库模式的建议

我有一个使用 ASP.NET MVC 开发的 Web 应用程序。

该应用程序遵循第n 层架构,我将应用程序分为 4 个不同的项目,分别是模型、核心、框架和 Web 应用程序。

模型、核心和框架是 DLL,模型只包含我的 POCO 类,核心包含我的 DbContext、存储库和工作单元实现,而我的框架项目包含将由我的 MVC Web 应用程序直接使用的类,例如 action-link扩展、自定义视图引擎等

除了我的框架之外,我还创建了一个名为 service 的类,它对我的​​核心 DLL 中的存储库进行方法调用,并且我的 Web 应用程序调用服务类中的方法。

我的问题是:通过我的框架 DLL 中的服务类将方法调用从 Web 应用程序传递到存储库是理想的,还是直接调用核心 DLL?

0 投票
1 回答
3045 浏览

asp.net-mvc - 使用数据库优先的方法,我如何分离核心层和基础设施层?

根据洋葱架构,我的“核心”或“域”层中应该有我的域模型(用户、学生、教师),我的“基础设施”层中应该有我的 DbContext。

我在我的 MVC4 应用程序中使用 Entity Framework 5,并且我正在使用 ADO.NET 数据库优先方法(应用程序的数据库已经存在)。由于 ADO.NET 为我生成实体(.edmx 文件),我如何将域与数据库层分开?

目前我在核心中有我的实体模型,但这不会破坏架构,因为核心不应该知道如何访问数据?

0 投票
1 回答
285 浏览

asp.net-mvc - Onion Architecture DI 层和 MSDeploy

我创建了一些我需要修复的混蛋洋葱架构。具体来说,我的 UI 层 (MVC) 中引用了我的依赖解决方案。我需要将它们拉出到他们自己的 WebActivator 程序集中,正如我在各处看到的推荐的那样,但我遇到了一堵大墙,找不到如何绕过它的解释。

我们的构建过程实际上构建了一个 web 包,以通过 xcopy 部署到服务器以用于所有意图和目的。这会运行 web.config 转换,仅包括项目文件等,因此我们可以确定发生了什么。

但是,当 MVC 站点没有对 DI 项目的引用时,如何在此过程中将其复制过来?理想情况下,我想避免在我的 PSake 构建脚本中添加一个部分,以便在构建项目后复制这个 DLL,但我不确定我最好的选择是什么。