[英]Does this match any known design pattern?
我正在为一家小型公司开发一个简单的内部ASP.NET应用程序。 我已经设计了数据访问层,因此它与数据库无关。
我有以下几点:
最后,我有一个静态类,该类创建一个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);
}
}
我的问题是:
抱歉,过长的帖子和多个问题。 :)
谢谢!
看起来像是策略模式。 使用该策略模式将能够在程序运行时更改底层功能,并且能够在不更改数据层基本流程的情况下创建新功能。 [通过IHelper界面保证功能]
您可以将其命名为DataHelperFactory。
这是一个很好的模式。 您绝对不希望到处泄漏ConfigurationManager.ConnectionStrings["myapp"].ConnectionString
之类的东西! 一个缺点是它是静态的,这使得使用它测试任何代码变得困难。
这最像是工厂模式或可能的服务定位器(不是策略)。
当前,您的代码将如下所示:
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.