bll,dal和接口实现

时间:2013-09-19 14:31:46

标签: asp.net interface n-tier-architecture 3-tier bll

我的问题与bll,dal,接口有关。

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

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

2 个答案:

答案 0 :(得分:3)

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

如果您只有一个实现,那么界面不是很有用,不推荐使用。

接口闪耀的地方,就是当你有多个相同逻辑的实现时。比方说数据访问层(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
}

答案 1 :(得分:2)

接口在很多例子中都很有用。为了给您一个最受欢迎的,请考虑通常用于数据层实现的存储库模式。

假设我为 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
    }
}