问题标签 [separation-of-concerns]

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 回答
4674 浏览

asp.net-mvc - 在 ViewModel 中放入什么

你在你的视图中放了什么?

Scott Hanselman最近的一篇关于使用特殊模型绑定器来简化测试的博客让我想到了以下问题:在构建视图模型的控制器逻辑中放置了什么,应该在视图中放置什么?他所做的是:

现在,我使用相同的方式将数据传递给我的视图,但我不确定他如何处理 Country 属性。您可能会争论双方:将国家列表包装在 SelectList 中会为视图准备数据,就像您创建视图模型 DTO 来传递数据一样。另一方面,感觉就像您在专门操作要在下拉列表中使用的数据,从而限制了视图处理来自控制器的数据的方式。我觉得这在视图和控制器之间的关注点分离上有点灰色地带,我真的无法决定走哪条路。有没有这方面的最佳实践?

PS:为简单起见,让我们假设默认的 ASP.NET MVC 上下文,所以基本上是您的开箱即用项目。默认视图引擎和所有爵士乐。

0 投票
1 回答
535 浏览

asp.net - asp.net 中的关注点分离导致层次结构混乱

我正在设计一个后台网站,使管理员能够管理内容、产品、价格等。我想在每个页面控制器(即代码隐藏类)将扩展的基类中解决两个问题,它们是:

  1. 将 ViewState 存储在磁盘上,以及
  2. 用户验证。

此外,我希望每个页面控制器在设置事件处理程序、填充表单和保存数据时都遵循相同的设计。我想通过创建页面控制器实现的抽象方法来解决这个问题。

现在,创建一个满足 ViewState 存储和用户验证的基类,并进一步定义如何以及何时设置事件处理程序、填充表单和持久化数据对我来说太混乱了。我喜欢高度的关注点分离,我倾向于创建三个基类​​:

System.Web.UI.Page
|
FileSystemStatePage : System.Web.UI.Page
(存储 ViewState)
|
SecurePage : FileSystemStatePage
(用户验证)
|
PageBase:SecurePage
(抽象,定义了设置事件处理程序、表单填充、保存的方法)

现在我对关注点的分离很满意,但我对深层的类层次结构并不感到兴奋。如果我发现自己需要用户验证但不需要磁盘上的 ViewState 怎么办?所以...

...你们通常如何解决这些问题?

0 投票
6 回答
3452 浏览

architecture - 您在项目中遵循 n 层架构和关注点分离的严格程度如何?

我想大多数开发人员都有多层架构的想法。我们有 DAL(数据访问层),我们有 BLL(业务逻辑层),并且在接近尽头的地方我们有我们的 UI。如果您的项目以某种方式遵循这些原则,您是否保留(或至少尝试)保留/放置它们在概念上属于的地方?我对与许多其他人一起工作的大公司应用程序特别感兴趣。显然,你可以用你的私人玩具项目做任何你想做的事,发明任何类型的架构并坚持下去。对于有很多人为软件做出贡献或整体混乱的大型项目来说,这并不容易。

例如,我碰巧看到诸如 UI 组件直接进入数据库以获取一些 BL 不提供的“丢失”额外数据,UI 和 BL 都使用表字段等低级元素,我认为它们应该委托这些操作到较低级别即 DAL。在与高级开发人员讨论这些事情后,我看到他根本没有看到这有问题,这尤其令人难过。

我们当然可以假设我和任何与我观点相同的人都只是完美主义者,但我清楚地看到了一个非常不利的后果,因为我在一些任务中花了很长时间来追踪所有“平行”路线数据往返于数据库,并确定现在可能受到我实施的新功能影响的人以及以何种方式受到影响。在我看来,当有人决定快速破解这些东西并尽快关闭任务时,这些增加了进一步的开发/维护成本,超过了一些节省。

你的项目是“纯粹的”还是他们很久以前就放弃了在层之间保持清晰界限的想法?如果您仍然保持正确,您将如何处理不了解这些事情或不关心他们只是构建“自定义”解决方案和黑客攻击的同事?或者在某个时间点你停止与风车战斗并接受它作为你的惩罚?

0 投票
1 回答
1341 浏览

spring - 如何通过脚本和 EL 集成 jBPM 和 Spring

我正在使用/期待以下技术堆栈:

  • JSF
  • 接缝
  • jBPM
  • 春天

当然,我希望 Seam 可以直接访问 Spring bean,并且可以正常工作。我现在想进入 jBPM 并开发一个概念验证流程定义,该流程定义访问 Spring bean 以执行操作和做出决策。

为了促进关注点分离并确保进程可以在类路径中没有 Seam 的情况下运行,我想要一个不允许访问所有 Seam 托管组件的解决方案。

我知道 Seam 使用定制的 EL 解析器,但除此之外,我从哪里开始?

0 投票
3 回答
3979 浏览

javascript - 使用 AJAX/JSON 提供静态 HTML 和生成内容有什么好处?

http://blog.urbantastic.com/post/81336210/tech-tuesday-the-fiddly-bits

Urbantastic 的 Heath 描述了他的 HTML 生成系统:

Urbantastic 中的所有 HTML 都是完全静态的。所有动态数据都通过 AJAX 以 JSON 格式发送,然后使用 Javascript 与 HTML 结合。换句话说,Urbantastic 的服务器软件专门生产和消费 JSON。HTML、CSS、Javascript 和图像都通过不同的服务(普通 Nginx 服务器)发送。

我认为这是一个有趣的模型,因为它在物理上将表示与数据分开。我不是架构专家,但似乎效率和稳定性会有所提高。

但是,以下问题与我有关:


  • [主观] Clojure 非常强大;Javascript 不是。在为另一个目标创建的语言上编写所有内容生成会产生一些痛苦(想象用 CSS 编写 Javascript 类型的代码)。除非他有一个用于生成 Javascript 的宏系统,否则 Heath 可能会在 JavaScript 和 Clojure 之间不断切换。他还会有很多JS代码;可能比 Clojure 更多。在切换到基于 LISP 的语言时,这在功能、快速开发、简洁性以及我们正在考虑的所有方面可能并不好。

  • [性能] 我对此不确定,但在用户机器上渲染所有内容可能会滞后。

  • [可访问性] 如果您禁用了 JS,则根本无法使用站点。

  • [accessibility#2] 我怀疑大量使用 JavaScript 填充的动态数据会产生跨浏览器问题。

任何人都可以发表评论吗?我有兴趣阅读您对这种架构的意见。

参考:

  1. 链接到关于 HN 的讨论。
  2. 链接到 /r/programming 的讨论。
0 投票
3 回答
3262 浏览

linq-to-sql - Linq to SQL DTO 和复合对象

我使用与其他人类似的方法将我的 LINQ 对象保存在我的 LINQ 数据提供程序中并返回 IQueryable 以允许过滤等。这适用于通过其 ID 或其他属性过滤简单对象,但我遇到了问题连接由其他子对象组成的表对象

coreDB.Positions 是我的 Linq Position 对象,我返回一个 DTO Position,它由 User、OrgUnit 和 Role 组成(基础表是一个带有 UserID、RoleID 和 OrgUnitID 的连接表)

我遇到的问题是,当我尝试在 Iqueryable 上添加过滤器时,我收到一条 SQL 错误,提示我的 DTO.User 对象没有可用的翻译

我完全不知道如何解决这个问题,因为我所有的谷歌结果似乎都是与直接使用生成的 LINQ 对象的人一起工作的

关于如何完成这项工作的任何想法,或者我在这里做错了什么?

谢谢

0 投票
3 回答
1455 浏览

data-access-layer - 从业务对象中抽象出数据访问层

将数据访问代码与业务对象分离并不是什么新鲜事,但我一直在寻找实现某些目标的“最佳方式”。

我有以下课程:

橙色 - 这是我的业务对象。

OrangeList - 这是一个橘子列表。

用户将通过调用 OrangeList.Fetch(someCriteria) 从数据存储中获取 Orange 对象。因此,OrangeList 必须具有对数据访问层的引用 - 所以它具有属性:IDataProvider MyDataProvider。

这对我有用,但问题是我们不能单独获取一个橙色 - 我们总是必须通过 OrangeList。

Orange 和 OrangeList 中的任何一个或两者都必须来自一些持有 DataProvider 的公共对象。

这是一个问题,还是我的方法一开始就离题了?

任何提示/指针表示赞赏,谢谢。

编辑:根据下面的讨论,我检查了存储库模式。

但是对于我的项目,我认为将存储库与 DAL 进一步分开是个好主意。

所以....存储库是我获取橘子和保存橘子的方式,但仍然不知道如何。我将它委托给 IDataProvider,它可能是图中列出的一些。

澄清一下 - Orange 不知道如何获取/更新自己,对吧?这是一个纯粹的业务对象——这就是重点吗?

替代文字 http://img22.imageshack.us/img22/2460/repositorya.jpg

如果你想知道,我的“LegacyDataProvider”是为了支持一个旧系统,它访问一个基于文件的数据库(FoxPro,eek)——但这让我可以把它包装起来,让它远离我的新代码。

在 .NET 程序集构造方面,为了防止循环引用,看起来我将拥有一个 Repository.DLL [OrangeRepo]、一个 DataProviderInterface.DLL [IDataProvider] 和一个 BusinessObjects.dll [Orange]。都好?

那我有没有关于存储库的想法?

0 投票
1 回答
253 浏览

linq-to-sql - 业务逻辑对象是否应该了解其 LINQ-to-SQL 数据对象?

我看过几个类似的问题,但没有看到任何直接适用于我的问题,所以如果这是重复的,请原谅我。

为了分离关注点,我试图以某种方式将我的业务对象与逻辑映射到 .dbml 文件中的 LINQ to SQL 数据对象(这对这个 btw 来说是相当新的)。不过看起来我的业务对象需要了解相应的 LINQ2SQL 对象。我阅读了这篇关于尝试通过使用 xml 映射文件来使用 POCO 的文章,这似乎与我想要的相似,只是我没有从表到类的一对一映射,因为有很多我需要为其创建一个额外的表的多对多关系。

我可以很好地将数据访问封装在我的业务逻辑中,这样使用我的业务对象的代码不需要知道任何关于数据库的信息,这很好,但是业务层仍然与数据访问层紧密耦合,这样如果不更改我的业务层对象或为不同的数据提供者创建新的对象(实现相同的接口),我就无法更换 DAL。

我怎样才能解耦这些层?

0 投票
1 回答
580 浏览

asp.net-mvc - 在领域驱动设计的上下文中,我在哪里可以找到有关身份验证和授权的信息?

我正在尝试以 DDD(域驱动设计)的方式做事。男孩,我挣扎。在我读过的所有书中,身份验证都是无关紧要的,也没有提到!

我编写了自己的身份验证和会员服务,负责注册和登录用户、创建加盐密码等。我不使用 .NET 的会员提供程序,但确实依赖表单身份验证。

我已经实现了一个包含用户名、电子邮件、密码哈希、批准状态等的用户模型。

现在我想域模型的其余部分不应该与用户相关。我有一个 Person 类,用于对 Person 及其相关数据进行建模。因此,它可用于对来自用户和非用户的个人数据进行建模。Company 类型的对象与 Persons 一起使用,而不是与 Users 一起使用。一个活动被分配给一个人,而不是一个用户。

问题是,我如何将 Person 模型与 User 模型联系起来?我真的不想在两个模型中的任何一个中相互引用。我是否应该创建一些名为 PersonUser 的关系模型并创建一个额外的服务来检索当前经过身份验证的用户的人员对象?

0 投票
4 回答
2000 浏览

asp.net-mvc - Asp.Net MVC Actions - 关注点分离/单一责任原则

在计算机科学中,我们被教导说每种方法都应该做一件事,而且只做一件事。我有点困惑,我们看到像下面这样的 MVC 操作作为良好实践的例子

基本上这段代码提供了很多功能:

  1. 定义如何访问操作 - 仅发布
  2. 定义谁可以访问操作 - 授权
  3. 访问持久化机制 -dinnerRepository
  4. 访问状态信息 - (User.Identity.Name)
  5. 将 NameValueCollection 转换为强类型对象 - UpdateModel()
  6. 为每个指定 3 个可能的 ActionResult 和内容 - InvalidOwner/Details/Edit 视图

对我来说,这似乎是一种方法的太多责任。这也是一个相当简单的操作,即它不处理常见场景,例如:

  1. 检查业务规则 - “永远不要相信用户输入”
  2. 导航路径 - 成功保存后始终返回“详细信息”
  3. 不同的返回类型 - 有人想从网格中调用“编辑”并需要 JsonResult?
  4. 更好的错误处理 - 如果在 GetDinner(id) 期间无法访问数据库,则 YSOD
  5. 构建额外的视图数据 - 下拉列表的 SelectLists

更不用说围绕这个单一方法所需的测试量,即模拟/伪造 FormCollection/UserIdentity/Authorization Provider/Repository/等。

我的问题是我们如何避免在控制器动作中塞进这么多东西?

我倾向于认为“意见”是一个很好的概念,尤其是“雷电原则”。虽然我非常尊重参与构建FubuMVC的人及其背后的原因,但我需要一些我现在可以使用的东西。

编辑-好吧,看来我是在追求这样的东西-自以为是的控制器。我需要进一步检查它,因为它适用于 MVC Preview 5,所以我可能需要自己更新它。