首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >N层应用设计

N层应用设计
EN

Stack Overflow用户
提问于 2015-03-16 09:30:01
回答 2查看 225关注 0票数 2

我对面向对象程序设计( OOP )中的Arhitecture设计相当陌生(我来自于编程机器人,所以这有点困难)。我参加的团队正在创建一个相当大的应用程序,领先的项目经理向我们展示了需求,在这个需求中,我们必须使用层来创建模块。我们正在使用的技术是用于数据存储的C# WinForms和Oracle。

我的模块由用户管理组成,我尝试将逻辑与实现分开,因此我有以下结构:

  • 业务层
  • 数据层
  • 表示层

我正在使用存储库模式和IoC与EF,一切看起来和工作良好,但现在我的老板告诉我,我需要将表示层与数据层完全分开。问题在于,在表示层,我使用IoC,如果我想创建一个用户对象,例如,我执行以下操作:

代码语言:javascript
复制
_userRepo.InsertNewUser(new User { props here } ); . 

所以这是不正确的,因为我直接访问DAL。我的老板告诉我,我需要另一个层来隔离这类调用并实现业务规则( ?!)

我搜索和研究了互联网,但没有发现任何帮助(主要是因为这里的一切都是在工作中过滤的)。

我想我的老板想要一个域层/服务层,但我不知道如何在当前的设计中实现它。我可以在没有任何问题的情况下发布该项目,任何敏感数据都将从代码中删除。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 13:22:12

我发这篇文章是为了回答这个问题,尽管它可能是基于意见的,即使我看不懂你老板的想法:-)

从根本上说,我认为老板想要的是减少所有层之间的依赖关系()。您选择这样做的架构模式取决于手头的应用程序。你描述的东西看起来像三层结构。让我们简要回顾一下三层体系结构的外观,以及应该如何工作:

  • 表示层显示信息并充当用户的边界。
  • 应用层(或业务逻辑)控制应用程序的功能。特别是,它处理数据并将其分发给其他层。
  • 包含数据访问层(DAL)的数据层存储或检索数据。它应该使您的应用程序独立于手头的存储解决方案。它通常与数据访问对象(DAOs)一起工作。

对于哪一层应该知道其他哪一层,有不同的思想流派。但根据我所读到的,我认为你应该把业务逻辑提升为某种中介。这意味着,业务逻辑知道表示层和数据层,但其他层不相互了解。我试图通过两个示例场景来澄清这一点:

A.显示现有用户

  1. 业务逻辑向数据层请求特定的User DAO,例如对应于id==123的数据层。
  2. 数据层返回User对象。
  3. 业务逻辑读取存储在User对象中的值,并相应地在表示层中设置值,例如firstNamelastName等。它只对包含的值进行而不是转发User本身。

B.创建一个新用户

  1. 表示层收集创建新用户所需的所有值。
  2. 当“提交”时,这些值到达业务逻辑(例如IoC)。
  3. 业务逻辑告诉数据层使用从表示层获得的值创建一个新的User对象。
  4. 数据层创建并存储对象。

在不同层之间创建dependencies的是DAO。也就是说,如果表示层要实例化一个User对象,那么它需要导入一个属于DAL的类(这不是老板想要的)。因此,您可以做的是将表示层和数据层之间的所有通信留给业务逻辑。

作为场景B中的另一种选择,您还可以让业务逻辑创建User,从而使DAL方法变得更简单。

正如我在开始时所说,没有一种办法可以做到这一点。如果你需要更多的具体信息或者有更多的问题,不要犹豫。

票数 1
EN

Stack Overflow用户

发布于 2015-03-17 15:22:00

感谢您给出的所有答案和指导方针。

我认为我的老板想要的(我没有接触到他,因为他在DE中,我在RO中)是完全分离层之间的关注点,类似于模型-视图-表示模式,这样表示层( UI )就不会直接访问数据层。它可以访问它,但通过中间层。

我在应用程序中添加了一个域/服务层,现在表示层调用服务层,服务层调用业务层并创建用户/组对象。

下面的事情是,他谈到了一些业务规则,这个域层应该包括这些规则。这些业务规则是什么,举个例子比较好?

我唯一想到的业务规则是一些验证规则,如下所示:在调用:返回userRepository.GetUserName(用户用户)之前,检查作为非空参数传递的用户对象,或者类似的检查。

因此,现在的“机制”是:

在表示层中,我将IService对象注入构造函数,然后使用IService对象调用方法,例如"GetAllUsers()“。

IService本身实际上是用户对象的Repository类的“副本”,因此当IService对象调用"GetAllUsers()“时,IService类中有一个确切的命名方法:”返回_userRepository.GetAllUsers()“--通过这种方式,表示层通过中间层调用对象特定的方法,这个中间层将直接访问DL的某些方法。

我希望我把自己弄清楚了。如有必要,我会提供截图。

正如我前面说过的,我只是要求有Arhitecture设计方面的经验,因为在机器人领域没有这种东西,所以请不要扔那么多石头。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29073383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档