我的问题与bll,dal,接口有关。
我的项目的结构或多或少都是这样的。 BLL, DAL, OBJ and 3 layer architecture (因为我不再重复问题和代码,我在这里给出链接)
我的问题是为什么我应该使用接口,有什么好处。以及如何根据上面给出的项目结构应用接口。 你可以提供链接或答案。谢谢大家
答案 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甚至不知道SqlRepository
或MySQLRepository
存在。它只是通过接口IRepository
进行通信。
接口的一些其他关键用途是解决C#中缺少多重继承以及某些Web服务实现的问题。我认为对于您当前的设置,我上面给出的示例是界面有用性和强大功能的一个更有用的演示。
绝对查找存储库模式以及依赖注入/控制反转。一旦你熟悉它,你会发现越来越多的地方使用接口来保持你的代码尽可能松散耦合。
以下是IRepository
和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
}
}