bll,dal 和接口实现

Posted

技术标签:

【中文标题】bll,dal 和接口实现【英文标题】:the bll,dal and interfaces implementation 【发布时间】:2013-09-24 16:58:02 【问题描述】:

我的问题与 bll,dal,interfaces 有关。

我的项目结构或多或少是这样的。 BLL, DAL, OBJ and 3 layer architecture (由于我不再重复问题和代码,我在这里给出链接)

我的问题是我为什么要使用接口,有什么好处。以及如何根据上面给出的项目结构应用接口。 你能提供链接或答案吗。谢谢大家

【问题讨论】:

【参考方案1】:

接口允许您在没有实际实现的情况下定义行为,将其视为合同。

如果你只有一个实现,那么接口不是很有用,不推荐。

接口的亮点在于您拥有相同逻辑的多个实现。比如说数据访问层(DAL),像这样:

public interface IPersonRepository

    Person CreatePerson(string firstName, string lastName, int age);
    Person LoadPerson(int personId);
    Person SavePerson(string firstName, string lastName, int age);
    bool DeletePreson(int personId);

现在,如果您有一个 SQL Server 数据库,那么您可以有一个实现 IPersonRepository 接口的存储库类,如下所示:

public class SqlServerPersonRepository : IPersonRepository

    // Implement SQL Server specific logic here

假设您也想支持 Oracle,然后创建一个 OraclePersonRepository,如下所示:

public class OraclePersonRepository : IPersonRepository

    // Implement Oracle specific logic here

另外有用的是您可以创建一个模拟人存储库(用于测试),如下所示:

public class MockPersonRepository : IPersonRepository

    // Implement mock logic here

【讨论】:

我应该在哪里存储项目中的所有接口,在 DAL 中?或 bll 或其他类别。再次感谢您 @user2460637 - 我将接口存储在域层中,我的应用程序的所有层都有引用。我推荐这种方法,因为如果将接口放在 DAL 中,那么任何需要这些接口的层都需要对 DAL 的引用。让所有层都依赖于 DAL 通常是一种不好的做法。理想情况下,您将拥有一个服务层,该服务层了解系统中的域对象以及如何存储和检索这些对象的接口。只是我的两分钱,随心所欲地使用它。 :-) @user2460637 查看领域驱动设计 (DDD)。您可以从以下文章开始:msdn.microsoft.com/en-us/magazine/dd419654.aspx 我正要问你,“你是什么意思域层”,是 BLL 的另一个名字还是我们在谈论域层??但它似乎完全不同的实现我给出了我的问题的链接的“类型化数据集”。 如果我想应用 n 轮胎架构怎么办,根据我在问题上提供的链接,您对实现接口的个人经验是什么。您在 BLL 中应用它们吗?再次感谢您【参考方案2】:

接口在很多示例中都很有用。为您提供最受欢迎的模式之一,请考虑常用于数据层实现的 Repository 模式。

假设我为 SQL Server 实现了我的 DAL。将来,我的公司决定改用 MySQL。我对 DAL 的所有 BLL 调用现在都容易被重写/大幅修改。

如果我使用了一个接口(比如IRepository),我可以写成SqlRepository,它实现了IRepository。然后我将获得 BLL 引用 IRepository,使用 依赖注入 在运行时将 SqlRepository 提供给 BLL。当业务决定使用MySQL时,我可以编写mysqlRepository,实现IRepository,然后我的所有BLL都不必重写来处理MySQL。事实上,我的 BLL 甚至都不知道SqlRepositoryMySQLRepository 的存在。它只是通过接口IRepository进行通信。

接口的其他一些关键用途是解决 C# 中缺乏多重继承的问题,以及一些 Web 服务实现。我认为对于您当前的设置,我上面给出的示例是对接口的有用性和功能的更有用的演示之一。

一定要查找存储库模式以及依赖注入/控制反转。一旦您对它感到满意,您就会发现越来越多的地方可以使用接口来保持您的代码尽可能松散耦合。

以下是IRepositorySqlRepository 实现的简短示例:

public interface IRepository

    List<string> GetUserIds();

    void CreateUser(string userId);

    bool DeleteUser(string userId);


public class SqlRepository : IRepository

    public List<string> GetUserIds()
    
        // Provide your implementation of GetUserIds.  
        // Connect to DB, retrieve data, return
    

    public void CreateUser(string userId)
    
        // Provide implementation
    

    public bool DeleteUser(string userId)
    
        // Provide implementation
    

【讨论】:

谢谢garrison,说的这么清楚,我会搜索你给的关键词和概念。 garrison,你存储界面的地方,你是否像 Karl 那样使用 DDD,或者你有其他方法,再次感谢你 对于较大的项目,DDD 是最佳选择,因为它会很快变得复杂。即使对于 n 层应用程序,我也可能会合并一个域层,它是所有其他层引用的根。您将拥有接口、任何数据传输对象(用于在层之间发送数据的对象)、域层中的模型。然后 BLL 和 DAL 将引用域层。 DAL 将实现接口并使用 DTO 将格式化数据返回给 BLL。这将允许您不让 BLL 引用 DAL,这有助于保持松散耦合。

以上是关于bll,dal 和接口实现的主要内容,如果未能解决你的问题,请参考以下文章

.net编程中BLL/DAL/Model等这些层是干啥的,怎样实现他们的相互连接!

桥接模式

业务层 (BLL) 数据访问层 (DAL) 和 UI 之间的通用结构?

简单反射使用

存储库模式:DAL 或 BLL [关闭]

使用复合设计模式扩展持久化的CURD,Select能力