在我的 API 中使用 BLL 函数而不参考 DAL

Posted

技术标签:

【中文标题】在我的 API 中使用 BLL 函数而不参考 DAL【英文标题】:Use BLL functions without reference the DAL in my API 【发布时间】:2017-06-07 19:03:52 【问题描述】:

我有 3 个项目 (C#) API、BLL 和 DAL。 DAL 引用 DAL,API 引用 BLL。

在我的 API 中,我需要使用所有 CRUD 函数,但我不能使用 BLL 中的函数,因为 VS 说“类型“blabla”是在未引用的程序集中定义的。您需要添加参考(DAL)”,但我不想在 API 项目中引用 DAL。有没有办法在不使用我的 DAL 项目的情况下做到这一点?

【问题讨论】:

如果 BLL 依赖于它,你必须引用你的主项目的 DAL。否则 BLL 将如何找到要调用的函数? DAL 的编译代码将丢失。这就是它的工作原理,不用担心。 但是你 BLL 应该在某个地方使用 DAL 吗? @ADyson 我的 BLL 项目使用 DAL,但是如果我在其中引用 BLL,为什么还要在 API 中添加对 DAL 的引用? 呃,我刚刚解释过了。如果 DAL 不存在,BLL 将如何从中调用函数? BLL 仅包含对 DAL 的引用,而不是编译后的代码本身。 这在架构师的图表上很不错,但它并不能反映 .NET 代码的编译方式。作为开发人员,您应该做的是确保您的 API 代码始终调用 BLL 函数,而不是 DAL 函数。然后你遵守架构。我希望任何审查代码的人也会对此进行检查。 【参考方案1】:

在我看来,您想要实现的是构建项目的好方法。我也在做同样的事情;只是我将在下面解释的微小差异。在 API 中不引用 DAL 可确保每次对 DAL 的调用仅通过 BLL。这是必要的,因为我想将所有数据处理逻辑放在一个地方。如果是分布式的,很难定位问题。

我有四个项目:

    Utils(你的“blabla”东西放在这里)[无任何参考] DAL(您的数据库内容放在此处)[参考实用工具] BLL(您的逻辑内容放在此处)[如果需要,请参考 DAL 和 Utils] Api(您的 API 内容放在此处)[如果需要,请参考 BLL 和 Utils]

这是一种方式引用链。 DAL => BLL => API。不应该存在倒序的引用。 Utils 应该是常见的东西,实体声明、异常、枚举等常见的东西应该去。

注意:即使您没有在 API 中引用 DAL,您也必须部署它。

为避免在 API 中使用 Utils,您可能需要再添加一层 DTO 并将它们与实体映射。请参考我的另一个question。

【讨论】:

如果 BLL 仍然引用 DAL,将 BLL 和 DAL 分开有什么好处? @DaveCousineau:正如回答Not referencing DAL in API makes sure that every call to DAL is only through BLL. 中所说。另请参阅参考链。 对我来说,我有 Utils、DAL/BLL 和 UI。我一直在玩弄将 DAL 和 BLL 分开的想法,但除非我引入一组 DAL 实现的接口,否则我看不出重点。然后 BLL 可以引用那些接口而不是 DAL,然后 BLL 将不依赖于 DAL。否则我不明白这一点。 好吧,我想到的一个原因是,在未来的项目中,您可能需要也可能不需要您已经实现的业务逻辑,并且如果您想使用相同的数据生成新的业务逻辑并保持它与现有的业务逻辑分开,那么数据需要在自己的库中与旧的业务逻辑分开。

以上是关于在我的 API 中使用 BLL 函数而不参考 DAL的主要内容,如果未能解决你的问题,请参考以下文章

我应该将 BLL 方法直接调用到我的 Asp.Net MVC 3 控制器中吗?

使用 DAL BLL 函数的 Windows 窗体不显示对象

使用 Linq To SQL 时,我是不是应该在 BLL 类中使用数据访问和业务逻辑

猕猴桃中的参考按钮

如何将 LINQ-to-SQL 映射到 BLL 类?

使用具有不同层的 LINQ 意味着我无法访问特定类型