我对面向对象程序设计( OOP )中的Arhitecture设计相当陌生(我来自于编程机器人,所以这有点困难)。我参加的团队正在创建一个相当大的应用程序,领先的项目经理向我们展示了需求,在这个需求中,我们必须使用层来创建模块。我们正在使用的技术是用于数据存储的C# WinForms和Oracle。
我的模块由用户管理组成,我尝试将逻辑与实现分开,因此我有以下结构:
我正在使用存储库模式和IoC与EF,一切看起来和工作良好,但现在我的老板告诉我,我需要将表示层与数据层完全分开。问题在于,在表示层,我使用IoC,如果我想创建一个用户对象,例如,我执行以下操作:
_userRepo.InsertNewUser(new User { props here } ); . 所以这是不正确的,因为我直接访问DAL。我的老板告诉我,我需要另一个层来隔离这类调用并实现业务规则( ?!)
我搜索和研究了互联网,但没有发现任何帮助(主要是因为这里的一切都是在工作中过滤的)。
我想我的老板想要一个域层/服务层,但我不知道如何在当前的设计中实现它。我可以在没有任何问题的情况下发布该项目,任何敏感数据都将从代码中删除。
任何帮助都将不胜感激。
发布于 2015-03-16 13:22:12
我发这篇文章是为了回答这个问题,尽管它可能是基于意见的,即使我看不懂你老板的想法:-)
从根本上说,我认为老板想要的是减少所有层之间的依赖关系()。您选择这样做的架构模式取决于手头的应用程序。你描述的东西看起来像三层结构。让我们简要回顾一下三层体系结构的外观,以及应该如何工作:
对于哪一层应该知道其他哪一层,有不同的思想流派。但根据我所读到的,我认为你应该把业务逻辑提升为某种中介。这意味着,业务逻辑知道表示层和数据层,但其他层不相互了解。我试图通过两个示例场景来澄清这一点:
A.显示现有用户
User DAO,例如对应于id==123的数据层。User对象。User对象中的值,并相应地在表示层中设置值,例如firstName、lastName等。它只对包含的值进行而不是转发User本身。B.创建一个新用户
User对象。在不同层之间创建dependencies的是DAO。也就是说,如果表示层要实例化一个User对象,那么它需要导入一个属于DAL的类(这不是老板想要的)。因此,您可以做的是将表示层和数据层之间的所有通信留给业务逻辑。
作为场景B中的另一种选择,您还可以让业务逻辑创建User,从而使DAL方法变得更简单。
正如我在开始时所说,没有一种办法可以做到这一点。如果你需要更多的具体信息或者有更多的问题,不要犹豫。
发布于 2015-03-17 15:22:00
感谢您给出的所有答案和指导方针。
我认为我的老板想要的(我没有接触到他,因为他在DE中,我在RO中)是完全分离层之间的关注点,类似于模型-视图-表示模式,这样表示层( UI )就不会直接访问数据层。它可以访问它,但通过中间层。
我在应用程序中添加了一个域/服务层,现在表示层调用服务层,服务层调用业务层并创建用户/组对象。
下面的事情是,他谈到了一些业务规则,这个域层应该包括这些规则。这些业务规则是什么,举个例子比较好?
我唯一想到的业务规则是一些验证规则,如下所示:在调用:返回userRepository.GetUserName(用户用户)之前,检查作为非空参数传递的用户对象,或者类似的检查。
因此,现在的“机制”是:
在表示层中,我将IService对象注入构造函数,然后使用IService对象调用方法,例如"GetAllUsers()“。
IService本身实际上是用户对象的Repository类的“副本”,因此当IService对象调用"GetAllUsers()“时,IService类中有一个确切的命名方法:”返回_userRepository.GetAllUsers()“--通过这种方式,表示层通过中间层调用对象特定的方法,这个中间层将直接访问DL的某些方法。
我希望我把自己弄清楚了。如有必要,我会提供截图。
正如我前面说过的,我只是要求有Arhitecture设计方面的经验,因为在机器人领域没有这种东西,所以请不要扔那么多石头。
https://stackoverflow.com/questions/29073383
复制相似问题