Mar*_*itt 17 design-patterns data-access-layer bll
我对感知"最佳实践"感兴趣,在这里用一点点现实来锻炼.
在Web应用程序中,您是否允许您的Web层直接访问DAL,还是应该首先通过BLL?
我特别谈的是没有真正涉及"业务逻辑"的场景 - 比如一个简单的查询:"获取姓氏为'Atwood'的所有客户".那些有任何逻辑的场景绝对会通过BLL,所以我们称之为moo.
虽然您可以将此方法封装在BLL对象中,但是当签名与DLL对象的签名完全相同时,似乎有点无意义,并且代码可能与将查询委派给DLL的一个简单的代码一样简单.
如果选择前者 - 使用BLL对象 - 你称这些对象是什么?(假设它们只是在DLL中提供查询层).助手?QueryProviders?
想一想.
问候
马蒂
Chu*_*way 34
我不同意这里的大多数帖子.
我在Web层中调用我的数据层.如果WEB/UI层之间没有任何内容,则无需创建"以防万一"的层.这是预优化.这是浪费.我记不起业务层"救了我"的时间.它所做的只是创造了更多的工作,重复和更高的维护.我花了数年时间订阅业务层 - >数据层在层之间传递实体.我总觉得很难创造通过没有做任何事情的方法.
在被Eric Evans介绍给Domain Driven Design之后,我做了有意义的事情.如果UI和数据层之间没有任何内容,那么我在UI中调用数据层.
为了允许将来的更改,我将所有数据层类包装在接口中.在UI中,我引用了接口,并使用依赖注入来管理实现.在做出这些改变后,它就像一股清新的空气.如果我需要在数据层和UI之间注入一些东西,我会创建一个服务.
我做的另一件事是减少项目数量.在我有一个数据层,业务逻辑,业务实体和某种类型的UI项目的项目之前 - 真是太痛苦了.
我有两个项目:核心项目(实体,业务逻辑和数据层)和UI项目(Web,Web服务等......)
有关更多信息,我建议看看这些人:
在我看来,您应该始终在Web层和DAL(数据访问层)之间使用BLL(业务逻辑层).
我很欣赏对于一些更"简单"的查询,BLL将密切模仿DAL(例如,获取所有国家/地区,获取所有产品类型等),但诚实,即使在您的示例中:
(取所有姓氏为'Atwood'的客户)
这里表达了"业务逻辑" - 希望通过姓氏过滤数据记录,如果没有别的话!
通过从项目开始实施BLL,在需要时可以非常容易地插入验证或额外的"逻辑"(并且如果您的项目是商业应用程序,那么如果不是这样,那么这种需求几乎肯定会出现.在项目开始时就在那里.添加其他逻辑,例如:
获取今年花费超过10000美元的所有客户
要么
不允许姓氏为"Atwood"的客户购买超过1000美元的商品
当涉及真正的BLL时,变得非常容易,而不是试图将这种逻辑扼杀到Web层.
请记住,对于上面的各种查询,我们几乎肯定会讨论多个实体和数据库表,这些实体和数据库表必须与特定定义的关系连接在一起才能实现此功能.试图通过直接操作DAL实现这一点变得混乱,因为你将处理多个实体和类.这里的BLL将极大地简化您的Web层代码,因为BLL将这些实体关系封装在一个大大简化的界面背后.
当需要改变用户界面时,这种" 关注点分离 "变得越来越重要.
现在至少在两个不同的场合,我使用网站用户界面从事商业网络应用程序,并最终被要求(由于客户寻求在其软件产品中寻求更好集成的业务需求)来生成Web服务接口提供与网站完全相同的功能.
如果我在我的Web层中嵌入任何业务逻辑,我将不得不在实现我的Web服务时复制并重写该逻辑.事实上,我确保所有业务逻辑都封装在BLL类中,这意味着我只需设计一系列Web服务接口方法调用,并将这些调用插入BLL类上的方法调用(我实际上使用了Facade Design Pattern在简化Web服务API的地方).
总之,我认为没有理由不包括我的DAL和我的web层之间的BLL层.
最简单的是,当BLL密切"模仿"DAL时,是的,似乎确实存在重复的代码和功能,但是,虽然打字更多,但这也使得它相对容易实现.
当它涉及更多时(例如从一开始就存在重要的业务逻辑),关注点的分离有助于减少重复(DRY原则),同时显着简化未来和持续维护.
当然,这假设你"手工"完成所有这些.如果您愿意,可以通过使用有很多的ORM来显着简化DAL/BLL/UI层!(即LINQ-to-SQL/Entities,SubSonic,NHibernate等)