我即将以旧的ado.net方式构建数据访问层。传统上我会根据一个简单的存储库模式构建dal。但是这一次我想尝试抽象工厂模式,因为我最近在一篇文章中读过这个模式。
所以在这里我尝试使用抽象工厂模式编写dal代码。首先让我解释一下到目前为止我得到了什么。之后我想知道的是我的方法是否是实现这种模式的正确方法,以及对存储库方法的优势。
所以我编写了以下课程:
public abstract class Db
{
//this is class will contain methods like:
//public abstract IDbConnection CreateConnectionInstance();
}
public class SqlDb : Db
{
//this is class will contain methods like:
//public override IDbConnection CreateConnectionInstance()
//{
// ... return new SqlConnection();
//}
}
public class OracleDb : Db
{
}
public class MockupDb : Db
{
}
//this class generates the fitting provider but does not have a base (is this correct?)
public static class DbFactory
{
public static Db CreateInstance(DbProviderType dbProviderType)
{
Db db = null;
switch (dbProviderType)
{
case DbProviderType.Oracle:
db = new OracleDb();
break;
case DbProviderType.Sql:
db = new SqlDb();
break;
case DbProviderType.Mockup:
db = new MockupDb();
break;
default:
break;
}
return db;
}
}
所以我的问题简而言之: 1)这是抽象工厂模式的正确实现吗? 2)什么可以做得更好? 3)从基类继承的不同存储库类有什么优势?
很多人。
如果您需要有关我的代码的更多信息,请告诉我。但此时此刻已经没有了!
答案 0 :(得分:3)
抽象db提供程序工厂已存在于.Net中。它被称为DbProviderFactory。您可以通过
创建不同的混凝土工厂var factory = DbProviderFactories.GetFactory("System.Data.OracleClient");
DbConnection connection = factory.CreateConnection();
为什么不使用盒子里已有的东西?
Here您可以阅读有关DbProviderFactories以及如何添加自定义工厂实施的更多信息。
答案 1 :(得分:0)
我想,你混合了一些概念。
存储库允许您从存储性质中抽象出来。它是一个黑盒子,它可以为你提供一个符合某些标准的物体,并将其收回。存储库内部可以在多个数据源中获取或存储对象(例如,存储在数据库中的一些对象数据,数据的另一部分 - 在文件中,或在外部设备中,这不能用关系数据源来描述)。
使用ADO .NET数据源时,工厂可以增加更多灵活性。但它不是存储库的替代品。存储库可以使用工厂来获取特定的数据源实现。
UPD。关于你的代码示例 - 当提供者的类型未知时,工厂应抛出异常。