2

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

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

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

4

2 回答 2

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
}
于 2013-09-19T14:54:08.280 回答
2

接口在很多示例中都很有用。为了给您提供最流行的一种,请考虑通常用于数据层实现 的存储库模式。

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

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

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

一定要查找Repository Pattern以及Dependency Injection / Inversion of Control。一旦你对它感到满意,你会发现越来越多的地方使用接口来保持你的代码尽可能松耦合。

IRepository以下是and的实现的一个简短示例SqlRepository

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
    }
}
于 2013-09-19T14:43:47.787 回答