在BLL层VS BLL方法单一重载方法具有DAL方法之一到一对应(Single overloaded

2019-10-17 17:27发布


假设我们创建3层模块,这使我们能够显示/创建/编辑文章。 文章如下:

•组织成类
•以前的文章可以发表,管理员可以通过设置审批 文章数据表的字段设置为true予以批准
•通过设置MembersOnly场( 第表 ),管理员还可以指定是否特定物品可以由任何人或只由注册用户可以查看
文章表还具有ExpiredDate领域,它告诉时候会在文章到期,因此不再发布


a)在DAL层,我们提供的方法GetAllArticles,GetArticlesByCategory,GetPublishedArticles和GetPublishedArticlesByCategory从数据库中检索文章

BLL层,我们使用GetArticles()重载调用上述所有的DAL方法。


  • 是什么一些使用单重载的方法中的BLL层代替BLL方法具有DAL方法一对一对应的好处? 唯一的好处我能想到的是,这种方式同样ObjectDataSource控件可以调用两个或两个以上GetArticles()的重载,根据参数的值,例如:

      public static List<Article> GetArticles(bool publishedOnly) { if (!publishedOnly) return GetArticles(); ... } 


  • 如果你不还设计UI层,因而无法确定哪些方法UI程序员会喜欢最,这将是一个DLL层的最佳实践提供GetArticles + GetAllArticles,GetArticlesByCategory,GetPublishedArticles和GetPublishedArticlesByCategory四个重载


2)当设计DAL方法来检索数据库的数据,你事先怎么能知道/预测(不首先设计UI),到底哪个方法(用于访问DB),我们应该在DAL层创建?

也就是说,在前面的例子中我已经检索基于参数个数文章的几种方法(基于分类它们属于,我们是否只是想发表的文章等)。 假设我卖这个模块第三方UI开发人员,那么有没有办法知道他们更喜欢哪个数据访问方法最:


一)我所以要创造尽可能多的数据访问方法,因为我可以让那些已经过期得到那些已经过期的所有文章的所有文章,一个想到的(一个,但从来没有公布,一个用于获取不属于所有文章出版,一个是让所有的物品,可以由注册用户可以只查看......)?


b)尽管所有的三个层我自己写的 - 我应该还是创建多达我能想到的数据访问方法?


感谢名单


编辑:

实现这一目标的一种常用方法是使用接口来定义的API的行为。

一)我不知道我理解这一点。 哪个类应该实现这个接口? 也许DLL类? 换句话说,如果我的DLL类的名称是文章,那么第三方将获得命名ChildArticle从第三类,其中ChildArticle也将实现这个接口? 还是你的意思别的吗?


B)反正,据我了解,提供接口(其中声明定义了额外的DLL方法来检索数据库的文章)也将需要已经适当的方法来定义DAL类,这将通过在接口中声明的方法叫什么名字?


为了你的观点,我认为这是更喜欢在BLL较少的粗粒度的方法来覆盖所有的整个业务操作所需的功能,是个好主意

我不熟悉这个词,但你的概率暗示我们应该更喜欢GetAllArticles,GetArticlesByCategory,GetPublishedArticles和GetPublishedArticlesByCategory超载GetArticles()?


A)的API的设计是严格把这是什么意思来实现,由谁来将使用它。 在实践中,这意味着你应该知道你的API的目标受众,并给予他们只需要怎样把工作做好。

除非我亲自面试会买我的产品的人,我一般猜测哪些方法,他们会发现有用的,但该空间内,还有任意数量的可能的方法我可以定义。 因此,我怎么会知道他们是否也应该有,比如说,GetArticles()重载其检索已经过期物品使用?


在另一边是完全正常的有在DAL许多小型的数据中心的方法与特定的数据工作。

如果不是DLL,应该DAL有尽可能多的数据访问方法,我可以拿出(针对特定的目标当然是受众)?


第二个编辑:

有几个扩展点可以被内置到API获得一定程度的灵活性。 实现这一目标的一种常用方法是使用接口来定义的API的行为。 这将使消费者更换或提供自定义实现扩展的内置功能件。

假设我创建了一个BLL层,然后提供一些额外的接口,消费者可以实现延长BLL的内置的功能。 但对于消费者能够实现这些接口,他们将需要访问BLL的源代码,对不对? 但是,如果我不想要什么消费者查看BLL的源代码?


接口应层之间。 更具体地讲,类应该只通过接口从其他层的类交互

一)因此,即使DAL的内置功能应该通过接口暴露? 但为什么? 也就是说,如果我们可以使用抽象类而不是接口,那么这个类可能已经实现共同从这个抽象类继承所有供应商类的一些实用功能? 在另一方面,如果DAL使用接口代替,则通用于所有供应商的实用功能将不得不为每个供应商一旦实施,这可能意味着大量的冗余编码?


B)不管怎么说,我不太看的好处(除非我们提供与消费者可能会延长具有不同于层通过接口进行交互类的基本功能)接口?


为了增加透明度,而不是重载方法与不同的参数来工作,我相信这是最好有接受单个参数的一个方法。 该参数将是包含所有数据,以便与工作的方法的对象。 一些数据可能是必须的,有些可能是可选的,并且会影响手术的效果。

如果我知道用户界面将广泛使用对象数据源控件,我应该还是喜欢BLL定义一个方法(具有对方法的所有数据对象作为参数,这种方法与工作),而不是方法重载?

队友的欢呼声

Answer 1:

我冒昧地总结您的文章在两个主要问题。 我希望我设法捕捉你所要求的精髓。

Q) 什么是由DAL暴露intefaces并通过BLL暴露的那些之间的关系?

A)该BLL是一个面向外的API,并且因此应该实现的功能是与外部消费者应用的有用的方式,对他们有意义暴露它
在DAL,相反,是一个面向内的API暴露的功能来检索和在隐藏所述存储机制的细节被使用方式留存数据

总之,DAL侧重于数据如何被代表,并在应用程序内部管理,而BLL专注于有意义给消费者的方式暴露数据。

Q) 公共API有多少方法应该具备的,而哪些?

A)的API的设计是严格把这是什么意思来实现,由谁来将使用它。
在实践中,这意味着你应该知道你的API的目标受众,并给予他们只需要怎样把工作做好
由于不可能预测所有可能的方式的API将被使用,它来决定支持哪些主要的使用情况 ,并努力使他们的API中真正直接的方式是很重要的。 一个好的原则要牢记是什么阿兰凯曾经说过:

简单的事情,应该是简单的,复杂的事情应该是可能的。

有几个扩展点可以被内置到API获得一定程度的灵活性。 实现这一目标的一种常用方法是使用接口来定义的API的行为。 这将使消费者更换或提供自定义实现扩展的内置功能件。

为了你的观点,我认为这是更喜欢在BLL较少的粗粒度的方法来覆盖所有的整个业务操作所需的功能,是一个好主意。
在另一边是完全正常的有在DAL许多小型的数据中心的方法与特定的数据工作。

更新:

关于接口
接口应层之间。 更具体地讲,类应该只通过接口与其他层的类交互。
例如,应该DAL暴露用于访问数据,如IOrderHeaderTableIOrderRepository根据设计图案被使用的类接口。
该BLL应公开用来执行业务操作,如IOrderManagementWorkflow,ICustomerService类。
注:内侧有一层普通的功能仍然可以放置在基类,因为像C#现代面向对象的语言,VB.NET和Java类既可以从基类继承,并实现一个或多个接口。
另外,谁愿意外部各方通过实施任何所提供的公共接口都可以做到这一点,而无需访问源代码定制的内置功能。 然而,接口应该是自我描述和详细记录,以使其便于扩展,了解它的语义。

关于BLL
该BLL应该明确它支持的业务逻辑。 因此,它通常是有直接相关的业务操作方法是一个好主意。
为了增加透明度,而不是重载方法与不同的参数来工作,我相信这是最好有接受单个参数的一个方法。 该参数将是包含所有数据,以便与工作的方法的对象。 一些数据可能是必须的,有些可能是可选的,并且会影响手术的效果。
实现细节:这种BLL的API被内置到ASP.NET Web窗体ObjectDataSource控件完全支持。

关于API
一个API应该包含的所有方法的设计者可以拿出, 通过用例的API是为了支持所定义的范围之内



文章来源: Single overloaded method at BLL layer vs BLL methods having one-to-one correspondence with DAL methods