我注意到一种趋势,即将业务逻辑从数据访问层(如存储过程、LINQ等)移至业务逻辑组件层(例如C#对象)。
这是否被视为现在“正确”的做法?如果是这样,这是否意味着一些数据库开发人员职位可能会被取代,转而更多地聘用中间层编码人员?(例如更多的C#代码,而不是更长的存储过程。)
我注意到一种趋势,即将业务逻辑从数据访问层(如存储过程、LINQ等)移至业务逻辑组件层(例如C#对象)。
这是否被视为现在“正确”的做法?如果是这样,这是否意味着一些数据库开发人员职位可能会被取代,转而更多地聘用中间层编码人员?(例如更多的C#代码,而不是更长的存储过程。)
其他可能会对您感兴趣的资源:
在我有机会体验大面团代码或意大利面代码之前,我很难理解为什么应用程序架构如此重要...
做事情的正确方式始终取决于您的应用程序的规模、可用性要求和寿命。对于中小型项目,像nHibernate和Linq to SQL这样的工具非常棒。为了让自己清楚,我从未在大型应用程序上使用过nHibranate或Linq To Sql,但我的直觉是,应用程序将达到一定规模,需要通过视图、存储过程等在数据库服务器上进行优化,以保持应用程序的性能。为了完成这项工作,需要具备开发和数据库技能的开发人员。
数据访问逻辑应该在数据访问层中,业务逻辑应该在业务层中。从设计角度来看,我不认为将两者混合在一起可以被视为一个好主意。
分层并不意味着业务逻辑不能使用存储过程。以下是一种可行的分层方式:
表现层:.Net、PHP或其他
业务层:存储过程
数据层:存储过程或DML
例如在Oracle中,这种方式非常有效,因为业务层可以在与数据层不同的模式中以包的形式实现(以强制执行关注点分离)。
重要的是关注点的分离,而不是每个层级所使用的语言/技术。
(我预计会因此被猛烈抨击!)
这真的取决于需求。无论哪种方式,只要它不是“在按钮后面”,我认为存储过程对于具有不断变化需求的“经典”客户端服务器应用程序更好。严格的中间“业务逻辑”层对于需要非常可扩展、运行在多个数据库平台等应用程序更好。
如果您正在构建分层架构,并且该架构包含专用业务层,则当然应该将业务逻辑放在那里。但是,您可以询问任何五个设计师/架构师/开发人员“业务逻辑”实际上是什么,并获得六个 不同的 答案。(嘿,我自己就是一名架构师,所以我知道所有关于“一方面,另一方面”的事情!)。导航对象图是数据层还是业务层的一部分?这取决于您使用的EAA模式以及您的域对象有多么复杂/聪明。或者它甚至是您的演示文稿的一部分吗?
但更具体地说:数据库开发工具往往落后于Eclipse/Visual Studio/Netbeans;而存储过程对于大规模开发来说从未非常舒适。是的,当然你可以用TSQL、PL/SQL等编写所有代码,但这是有代价的。此外,在一个解决方案中涉及多种语言和平台的成本会增加维护成本和延迟。另一方面,将数据访问移出DBA的控制范围可能会引起其他问题,特别是在具有任何可用性要求的共享基础设施环境中。但总的来说,现代工具和语言目前正在将逻辑从数据(库)层移动到应用程序层。我们将看到它的实际效果和扩展性如何。
在规划业务规则的撰写位置时,还需要考虑技术原因/限制。
在大多数LOB应用程序中,集中和性能推动开发人员将数据库本身用作主要的业务层,因此,在某种程度上,DAL和BL被混合或统一了。
一个典型的例子是计算租赁物品当前位置的字段,这是一个应该为一个或多个列出的项目提供的信息,使用带有用户定义函数的SQL视图是保存规则的最强大的候选项。
当然,上述示例仅在首选特定数据库设计和流程实现时才有效,但我想指出的是,在现实世界中,我们更常根据技术限制和其他原则进行选择,而不是组织我们的代码。
是的,业务逻辑应该放在业务逻辑层。对我来说,使用存储过程处理所有事情,并将一些业务规则移动到数据库中是最大的缺点,我更喜欢将这个逻辑放在业务逻辑层(BLL),只让数据访问层(DLL)与数据库进行通信。
将你的层分离开始终是个好主意。我无法告诉你有多少次我看到存储过程非常复杂,因为很多业务逻辑都写在了存储过程中。此外,如果您出于任何原因修改了复杂的存储过程,则有可能破坏使用它的所有内容。
我们公司的开发人员正在转向使用LINQ和EF,并且除非我们绝对需要它,否则不再使用存储过程。当EF没有困难时,LINQ和EF使我们更容易分离层...但这又是另一个故事了。 :)