【问题标题】:Correct approach on implementing abstract factory pattern?实现抽象工厂模式的正确方法?
【发布时间】:2012-05-08 02:32:49
【问题描述】:

我即将以古老的 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) 从基类继承的不同存储库类有什么优势?

谢谢很多人。

如果您需要有关我的代码的更多信息,请告诉我。但目前没有更多内容了!

【问题讨论】:

    标签: c# design-patterns data-access-layer abstract-factory


    【解决方案1】:

    我认为,你混淆了一些概念。

    存储库允许您从存储性质中抽象出来。它是一个黑盒子,它可以给你一个对象,匹配一些条件,然后把它拿回来。 Repository internals 可以在多个数据源中获取或存储对象(例如,一些对象数据存储在数据库中,另一部分数据 - 在文件中,或者在外部设备中,不能用关系数据源来描述)。

    在使用 ADO .NET 数据源时,Factory 可以增加更多的灵活性。但它不能替代存储库。 Repository 可以使用工厂来获取特定的数据源实现。

    更新。关于您的代码示例 - 当提供者的类型未知时,工厂应该抛出异常。

    【讨论】:

      【解决方案2】:

      .Net 中已经存在抽象数据库提供程序工厂。它称为DbProviderFactory。您可以通过

      创建不同的具体工厂
      var factory = DbProviderFactories.GetFactory("System.Data.OracleClient");
      DbConnection connection = factory.CreateConnection();
      

      为什么不使用盒子里已有的东西?

      Here您可以阅读更多关于 DbProviderFactories 以及如何添加自定义工厂实现的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 2018-08-12
        • 1970-01-01
        相关资源
        最近更新 更多