关于“-是否将业务逻辑放入存储过程?”这一主题一直存在争议。如果我们决定不使用ORM工具并且不将业务逻辑放入存储过程中,那么我们将业务逻辑放在哪里?
在以前的应用程序中,我始终倾向于仅将所有业务逻辑放入存储过程中。然后从.NET代码中,我使用数据访问应用程序块调用这些存储过程。SQLHelper等。但这并非一直都是这种情况。所以我做了一些谷歌搜索,但最终陷入了混乱。
有什么建议...吗?
关于“-是否将业务逻辑放入存储过程?”这一主题一直存在争议。如果我们决定不使用ORM工具并且不将业务逻辑放入存储过程中,那么我们将业务逻辑放在哪里?
在以前的应用程序中,我始终倾向于仅将所有业务逻辑放入存储过程中。然后从.NET代码中,我使用数据访问应用程序块调用这些存储过程。SQLHelper等。但这并非一直都是这种情况。所以我做了一些谷歌搜索,但最终陷入了混乱。
有什么建议...吗?
Answers:
我将采用务实的方法-从历史上看,将业务逻辑保留在存储的proc中的主要“好处”是出于性能方面的考虑(2.5层体系结构),而将业务逻辑分为BLL层(3 / N层)通常比使用BLL层更清洁。维护角度,并且更易于测试(模拟/存根出数据访问权限)。
但是,考虑到像LINQ2SQL,EF和NHibernate这样的启用LINQ的.NET ORMS现在可以创建参数化的SQL查询,可以在其中缓存查询计划,可以将其转义用于SQL注入等,因此我认为向3 / N层体系结构迈进是比以往任何时候都更具吸引力,并且可以完全避免大多数SPROC(尤其是以查询为中心的SPROC)。.NET中的存储库模式通常公开IQueryable / accept Expression树形参数,从而允许对表进行类型安全且灵活的访问。(个人而言,在SOA类型的体系结构中,我不会在BLL之外公开IQueryable,即,您的Service和Presentation层应该使用一组定义良好的方法。原因是否则您将无法完全测试系统,而您将无法
但是,在一个体面的系统中,总会有一些例外,出于性能原因,可能仍然需要将一块真正的数据密集型代码编写为存储过程。在这些情况下,我将保留SPROC,并通过ORM公开SPROC,但仍将函数作为BLL上的传递方法公开。
作为一名Java开发人员,我的首选是将业务逻辑放入BLL中(很好且易于实现的源代码控制,熟悉程度等)。
但是,在为拥有许多使用不同技术(C#,Java,Pick(不要问)的分布式应用程序)的大型企业工作之后,使用存储过程的一个明显好处就变得显而易见:
可以在不同的应用程序之间共享存储过程。
我们的团队在这里有一个软性规则。有时最好在T-SQL中解决业务逻辑,有时在c#(业务层)中更容易做到。
因此,我们有一个务实的解决方案:将其放在更合适的位置。我知道理论有时对此非常严格...但这就是理论:-)
两者都有优点和缺点(我认为):
如果您不使用某种SQL源代码控制(很多地方都没有),并且有多个开发人员在使用它们,则存储过程可能会成为噩梦。有人可以更改存储过程,而忘了更新调用该过程的代码,而在您不知道它之前,您刚刚构建并部署了一个站点,该站点将引发未处理的异常(参数计数不匹配等)。
另一方面,存储过程可以在某些情况下更快地修复错误。如果存储过程中存在错误,则只需对其进行修复即可。ORM中的错误修复需要重新构建。根据您的构建过程,这可能会很长/很烦人。
我们始终将业务逻辑放在业务逻辑层中。如果将其放在存储过程中,则在更改RDBMS后,它将丢失。
逻辑应该始终在BLL中,因为:
我认为应该有一条法律规定,SP超过X行之后,它将无法按预期运行。