4

当我在我们的网站上优化我的应用程序架构时,我遇到了一个我不知道最佳解决方案的问题。

现在我们有一个基于这个结构的小 dll:

Database <-> DAL <-> BLL 

Dal 使用 Business Objects 传递给 BLL,BLL 将把它传递给使用这个 dll 的应用程序。

只有 BLL 是公开的,因此任何包含此 dll 的应用程序都可以看到该 bll。

起初,这对我们公司来说是一个很好的解决方案。但是当我们在那个 Dll 上添加越来越多的应用程序时,Bll 变得越来越大。现在我们不希望某些应用程序可以从其他应用程序中看到 Bll 逻辑。

现在我不知道最好的解决方案是什么。

我想到的第一件事是,将 bll 移动并分离到我可以包含在我的应用程序中的其他 dll 中。但是 Dal 必须是公开的,这样其他 dll 才能获取数据……而且我似乎是一个很好的解决方案。

我的另一个解决方案是将 bll 分隔在不同的名称空间中,并且只包含应用程序中需要的名称空间。但在此解决方案中,您可以根据需要直接访问其他 bll。

所以我在征求你的意见。

4

4 回答 4

4

对于每个业务“部分”,您应该有一个不同的 BLL 和 DAL ......例如:

  • 我的公司.人力资源.BLL
  • 我的公司.Insurance.BLL
  • MyCompany.Accounting.BLL
于 2010-05-11T14:32:07.323 回答
3

我同意@MikeC。为每个段分隔命名空间中的 BLL。此外,也将 DAL 分开,如下所示:

  • 我的公司.人力资源.DAL
  • 我的公司.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 想法只是一个想法

于 2010-05-11T15:05:23.020 回答
2

我建议你将你的业务逻辑根据它们的针对性(按照上一篇文章)分成不同的dll,这些类将实现特定的接口,而这个接口将在你的业务登录消费者身上声明。然后我建议你实现容器(参见控制反转理论)来解决 dll 实现,这将允许你将业务逻辑实现与消费分开,你将能够毫无困难地用另一个实现替换一些实现。

我捍卫使用 IoC 提供程序,而不是直接使用业务经理类(想想可能导致噩梦的引用)。该解决方案解决了 dll 的隔离和优化消耗的问题。

于 2010-05-11T15:05:16.337 回答
2

听起来您有通用的业务逻辑,通常适用于您的组织,以及每个部门或部门的更具体的逻辑。您可以以某种方式设置您的代码,以便每个部门。仅取决于它们的特定逻辑,在幕后使用“基本”逻辑中的任何通用功能。为此,您可以设置以下项目:

  • 商业.BLL
  • 商业.金融.BLL
  • 商业.IT.BLL
  • (等等,无穷无尽,等等......)

请注意,它们中的每一个都可以是一个单独的项目,可以编译成自己的程序集。一个部门只需要使用他们自己的程序集。

就数据访问而言,您可以在基本 BLL 中使用通用数据访问例程。您的特定 BLL 可以有自己的专用数据查询,这些查询被汇集到基础 BLL,而基础 BLL 又使用通用 DAL 并将结果返回到链上。

于 2010-05-12T19:32:09.420 回答