业务逻辑的分离

4
当我在优化我们网站的应用程序架构时,遇到一个问题,我不知道最佳解决方案。
目前,我们有一个基于以下结构的小型dll:
Database <-> DAL <-> BLL 

Dal使用Business Objects传递给BLL,然后BLL再将其传递给使用此dll的应用程序。
只有BLL是公共的,所以任何包含此dll的应用程序都可以看到BLL。
开始时,这对我们公司来说是一个不错的解决方案。但是当我们在该Dll上添加越来越多的应用程序时,BLL就变得越来越大了。现在我们不想让其他应用程序看到来自其他应用程序的BLL逻辑。
现在我不知道最好的解决方案是什么。
首先我想到的是,将BLL移动和分离到其他dll中,这样我就可以将它们包含在我的应用程序中。但是那时Dal必须是公共的,这样其他dll才能获取数据...而且这似乎是一个好的解决方案。
我想到的另一种解决方案是,只需将BLL分隔成不同的命名空间,并仅在应用程序中包含您需要的命名空间。但是在这个解决方案中,如果您想要,您可以直接访问其他bll。
因此,我想听听您的意见。

你关心的是易用性还是安全性?即,你希望API的用户能够轻松找到并使用他们感兴趣的BLL方法,还是希望防止访问某些方法?或者两者都要考虑? - Randy Levy
设置正确答案是很好的。 - Erup
@ Tuzo:很容易找到正确的bll,而且他们不会对其他bll做错事。抱歉回复晚了,没有看到你在这里的评论。但还是谢谢你的询问! @ Erup:我的问题更多是一个普遍性的问题,想听听大家的意见。我认为并没有真正正确的答案。但所有这些答案都帮助我找到了解决方案,我很高兴。再次抱歉回复晚了。 - bruno
4个回答

4

每个“业务段”应该有一个独立的BLL和DAL...例如:

  • MyCompany.HumanResources.BLL
  • MyCompany.Insurance.BLL
  • MyCompany.Accounting.BLL

(说明:BLL是业务逻辑层,DAL是数据访问层)

谢谢你的回答,它帮助我很多来创建我的应用程序! - bruno

3

我同意@MikeC的观点。为每个部分单独创建命名空间来分离BLL。同样,也要将DAL分离,如下所示:

  • MyCompany.HumanResources.DAL
  • MyCompany.Insurance.DAL

另外一件事是分离dll文件。这样,您就不需要将DAL公开。它将成为一个业务层(类似于WCF或Web服务),负责每个系统的BLL和DAL,使得支持和维护更加容易。我不知道这是否对您公司来说是最实惠的方法(在复杂性方面),但这是更好的设计目的的方法。

以前,公司开发的应用程序使用组件架构-通过应用程序共享组件。我们意识到,这不是最好的设计方法,今天许多系统(在生产环境中)都采用了这种设计方法。

此外:如果您想要更复杂的操作,还可以生成一个通用的dbHelper组件,负责维护数据访问,包括控制连接、命令和事务的操作。这样,可以避免重新编写代码。该程序集可以使用企业库或其他组件。操作示例可能如下:

public DbCommand CreateCommand()
    {
        if (this._baseCommand.Transaction != null)
        {
            DbCommand command = this._baseConnection.CreateCommand();
            command.Transaction = this._baseCommand.Transaction;
            return command;
        }
        return this._baseConnection.CreateCommand();
    }

你可以将它虚拟化,实现一个SqlCommand CreateCommand等操作。
记住:我提出的通用dbHelper想法只是一个“想法”!

抱歉如果这篇文章变得太复杂了。但我认为需要分析整个应用程序的设计,不仅仅是业务逻辑层(BLL),还包括数据访问层(DAL)和程序集的使用。 - Erup
谢谢你的想法!现在对我来说还是太复杂了,但也许过一年我就能理解了 :-D - bruno

2
我建议您按照其相关性将业务逻辑分成不同的dll文件(根据之前的帖子),这些类将实现特定接口,而此接口将在业务逻辑使用者中声明。然后,我建议您实现容器(参见IoC理论)来解决dll实现问题,这将使您能够将业务逻辑实现与消费分开,并且您将能够轻松地用另一个实现替换某些实现。
我主张使用IoC提供程序而不是直接使用业务管理器类(考虑到可能会导致噩梦般的引用)。这种解决方案解决了dll隔离和其优化消耗的问题。

谢谢你的回答,它帮助我很多来创建我的应用程序! - bruno

2
听起来你有一些通用的业务逻辑,适用于你的整个组织,以及更具体的每个部门或部分的逻辑。你可以设置代码,使每个部门只依赖于他们特定的逻辑,而在幕后使用“基础”逻辑中的任何通用功能。为此,您可以设置以下项目:
- Business.BLL - Business.Finance.BLL - Business.IT.BLL - (等等,无限循环,等等...)
请注意,每个项目都可以是单独的项目,编译为自己的程序集。一个部门只需要使用自己的程序集。
至于数据访问,您可以在基础BLL中拥有通用数据访问例程。您的特定BLL可以有自己的专业数据查询,这些查询会被传送到基础BLL,基础BLL再使用通用DAL并将结果返回给上级。

谢谢你的回答,它帮助我很多来创建我的应用程序! - bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接