Вы можете назвать его 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);
}
}