我的问题与 bll,dal,interfaces 有关。
我的项目结构或多或少是这样的。 BLL、DAL、OBJ 和 3 层架构 (由于我不再重复问题和代码,我在这里给出链接)
我的问题是我为什么要使用接口,有什么好处。以及如何根据上面给出的项目结构应用接口。你能提供链接或答案吗?谢谢大家
我的问题与 bll,dal,interfaces 有关。
我的项目结构或多或少是这样的。 BLL、DAL、OBJ 和 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
}
接口在很多示例中都很有用。为了给您提供最流行的一种,请考虑通常用于数据层实现 的存储库模式。
假设我为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
}
}