繁体   English   中英

这是否与任何已知的设计模式匹配?

[英]Does this match any known design pattern?

我正在为一家小型公司开发一个简单的内部ASP.NET应用程序。 我已经设计了数据访问层,因此它与数据库无关。

我有以下几点:

  • IDataHelper-需要诸如FillDataTable(),ExecuteNonQuery()等方法的接口。
  • MySqlHelper-为MySQL实现IDataHelper,这是我到目前为止支持的唯一数据库。
  • 静态数据访问类 -封装应用程序不同部分的数据访问方法。 他们在IDataHelper上调用方法以执行查询。

最后,我有一个静态类,该类创建一个IDataHelper来调用数据访问类。 将来,它将根据配置文件中指定的数据库创建适当的帮助程序。 现在,它只是硬编码来创建MySqlHelper:

public static class DataHelperContainer
{
    private static IDataHelper dataHelper;

    public static IDataHelper DataHelper
    {
        get { return dataHelper; }
    }

    static DataHelperContainer()
    {
        string connectionString = ConfigurationManager
            .ConnectionStrings["myapp"].ConnectionString;

        // Support for other databases will be added later.
        dataHelper = new MySqlHelper(connectionString);
    }  
}

我的问题是:

  1. 我应该怎么称呼它? “ DataHelperContainer”似乎不正确,因为这暗示了某种列表。
  2. 这是好设计还是坏设计? 如果不好,有什么毛病?
  3. 这类似于任何已知的设计模式吗? 可以重构以符合一个吗? 似乎有点像工厂,但我不确定。

抱歉,过长的帖子和多个问题。 :)

谢谢!

看起来像是策略模式。 使用该策略模式将能够在程序运行时更改底层功能,并且能够在不更改数据层基本流程的情况下创建新功能。 [通过IHelper界面保证功能]

  1. 您可以将其命名为DataHelperFactory。

  2. 这是一个很好的模式。 您绝对不希望到处泄漏ConfigurationManager.ConnectionStrings["myapp"].ConnectionString之类的东西! 一个缺点是它是静态的,这使得使用它测试任何代码变得困难。

  3. 这最像是工厂模式或可能的服务定位器(不是策略)。

当前,您的代码将如下所示:

public class MyClass
{
    public void DoSomething()
    {
        var helper = DataHelperFactory.Create();

        helper.ExecuteNonQuery("some sql");
    }
}

这是不容易测试的,因为您必须修改app.config才能更改返回测试的帮助程序。 也许您想测试当helper.ExecuteNotQuery抛出异常时会发生什么。

使用依赖注入,您的类将更改为:

public class MyClass
{
    private IDataHelper helper;

    public MyClass(IDataHelper helper)
    {
        this.helper = helper;
    }

    public void DoSomething()
    {
        helper.ExecuteNonQuery("some sql");
    }
}

这里的权衡是,现在您必须处理在调用上下文中提供IDataHelper依赖项的问题。 这是输入IoC容器(如Unity,Windsor和StructureMap)的位置。 但是,这比较复杂,在您的情况下可能不值得。

使用工厂(即使是静态工厂)也很棒。 它允许您使用装饰器等其他模式来添加其他行为。 考虑一种情况,在该情况下您要清理您的sql字符串并确保没有任何坏消息发送到您的数据库:

public class SanitizingDataHelper : IDataHelper
{
    private IDataHelper helper;

    public SanitizingDataHelper(IDataHelper helper)
    {
        this.helper = helper;
    }

    public void ExecuteNotQuery(string sql)
    {
        sql = EscapeHarmfulSql(sql);
        helper.ExecuteNonQuery(sql);
    }

    private string EscapeHarmfulSql(string sql)
    {
        ...
    }
}

然后,您的工厂可以执行以下操作:

public class DataHelperFactory
{
    public IDataHelper Create()
    {
        ...

        var helper = new MySqlDataHelper(connectionString);

        return new SanitizingDataHelper(helper);
    }
}

对于数据访问类,似乎可能是数据访问对象(DAO)模式,但是我不确定您是如何实现的。 安迪·韦斯特(Andy West)是对的,您肯定在那里有一种策略模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM