Соответствует ли это какому-либо известному шаблону дизайна? - PullRequest
1 голос
/ 28 ноября 2009

Я работаю над простым внутренним приложением ASP.NET для небольшой компании. Я разработал слой доступа к данным, чтобы он не зависел от базы данных.

У меня есть следующее:

  • IDataHelper - интерфейс, требующий такие методы, как FillDataTable (), ExecuteNonQuery () и т. Д.
  • MySqlHelper - Реализует IDataHelper для MySQL единственная база данных, которую я поддержка пока.
  • Статические классы доступа к данным - Инкапсулировать методы доступа к данным для разные части приложения. Oни вызвать методы на 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. Это похоже на любой известный дизайн шаблон? Это может быть реорганизовано в соответствовать одному? Похоже отдаленно как фабрика, но я не уверен.

Извините за длинный пост и несколько вопросов. :)

Спасибо!

Ответы [ 3 ]

4 голосов
/ 28 ноября 2009

Похоже на шаблон стратегии . С шаблоном стратегии можно будет изменять базовые функциональные возможности во время выполнения программы и создавать новые функциональные возможности без изменения основного потока ваш уровень данных. [Функции гарантируются через интерфейс IHelper]

2 голосов
/ 28 ноября 2009
  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);
    }
}
1 голос
/ 28 ноября 2009

Для классов доступа к данным может показаться, что это может быть шаблон объектов доступа к данным (DAO), но я не совсем уверен, как вы это реализуете. Энди Уэст прав, у вас определенно есть шаблон Стратегии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...