Шаблон стратегии для базы данных Oracle?


Я пытаюсь реализовать шаблон стратегия в моей текущей кодовой базы. Я хотел бы знать, если я иду в правильном направлении?

IOracleDB.в CS:

/// <summary>
/// Strategy
/// </summary>
interface IOracleDB
{
    DataSet DatabaseQuery(string query, OracleConnection oracleConnection);
    DataSet DatabaseQuery(string procedure, string parameters, OracleConnection oracleConnection);
}

OracleDBContext.в CS:

/// <summary>
/// Context
/// </summary>
class OracleDBContext
{
    private readonly string _EmailConnectionString = ConfigurationManager
        .ConnectionStrings["EmailConnectionString"].ConnectionString;

    private readonly string _PhConnectionString = ConfigurationManager
        .ConnectionStrings["PhConnectionString"].ConnectionString;

    private readonly IOracleDB _oracleDB;
    private readonly OracleConnection _oracleConnection;

    public OracleDBContext(IOracleDB oracleDB, string table)
    {
        _oracleDB = oracleDB;

        switch (table.ToUpper())
        {
            case "Email":
                _oracleConnection = new OracleConnection(_EmailConnectionString);
                return;

            case "Ph":
                _oracleConnection = new OracleConnection(_PhConnectionString);
                return;

            default:
                return;
        }
    }

    public void ConnectToDatabase()
    {
        _oracleConnection.Open();
    }

    public void DisconnectFromDatabase()
    {
        _oracleConnection.Close();
        _oracleConnection.Dispose();
    }

    public string ConnectionStatus()
    {
        if (_oracleConnection != null)
        {
            return _oracleConnection.State.ToString();
        }
        return "OracleConnection is null.";
    }

    public DataSet DatabaseQuery(string query)
    {
        return _oracleDB.DatabaseQuery(query, _oracleConnection);
    }

    public DataSet DatabaseQuery(string procedure, string parameters)
    {
        return _oracleDB.DatabaseQuery(procedure, parameters, _oracleConnection);
    }
}

EmailTableClass.в CS:

/// <summary>
/// Concrete Strategy
/// </summary>
class EmailTableClass : IOracleDB
{

    public DataSet DatabaseQuery(string query, OracleConnection oracleConnection)
    {
        DataSet dataSet = new DataSet();
        OracleCommand cmd = new OracleCommand(query);
        cmd.CommandType = CommandType.Text;
        cmd.Connection = oracleConnection;

        using (OracleDataAdapter dataAdapter = new OracleDataAdapter())
        {
            dataAdapter.SelectCommand = cmd;
            dataAdapter.Fill(dataSet);
        }

        return dataSet;
    }

    public DataSet DatabaseQuery(string procedure, string parameters, OracleConnection oracleConnection)
    {
        throw new NotImplementedException();
    }
}

PhTableClass.в CS:

/// <summary>
/// Concrete Strategy
/// </summary>
class PhTableClass : IOracleDB
{

    public DataSet DatabaseQuery(string query, OracleConnection oracleConnection)
    {
        throw new NotImplementedException();
    }

    public DataSet DatabaseQuery(string procedure, string parameters, OracleConnection oracleConnection)
    {
        DataSet dataSet = new DataSet();
        OracleCommand cmd = new OracleCommand
        {
            CommandText = procedure,
            CommandType = CommandType.StoredProcedure,
            Connection = oracleConnection,
        };

        OracleParameter oracleParameter = new OracleParameter
        {
            ParameterName = parameters
        };

        using (OracleDataAdapter dataAdapter = new OracleDataAdapter())
        {
            dataAdapter.SelectCommand = cmd;
            dataAdapter.Fill(dataSet);
        }

        return dataSet;
    }
}


1876
5
задан 28 июня 2011 в 07:06 Источник Поделиться
Комментарии
2 ответа

Есть несколько вопросов, которые могли быть улучшены:


  1. Во-первых, иметь конкретные классы, которые привязаны к определенной базе данных (в данном случае с Oracle), как правило, совершенно противоположное тому, что должна быть ответственность слой данных. Рассмотреть вопрос об изменении названия классов следующим образом:


    • Объекта Oracleconnection --> DbConnection И

    • OracleCommand --> Dbcommand В

    • OracleParameter --> Dbparameter, Указывая.

    Для создания новой команды, не использовать специальный конструктор, а использовать соединение с БД.CreateCommand() метод (и, аналогично, объектов dbcommand.CreateParameter() , чтобы создать его параметров). Это означает, что вам только нужно изменить фактический экземпляр подключения, Если вы решите перейти с Oracle на другого провайдера дБ один день.


  2. Далее, стратегия шаблон обычно используется для абстрактных функциональность, которая несколько различных алгоритмов могут выполняться, в то время как разоблачение единая (общая) интерфейс. Создавая различные стратегии для разных запросов к таблице не подходит, потому что вызывающий код уже знает что таблицы запроса (нет дополнительных стратегических вариантов кода).

  3. Я не уверен, если исключение notimplementedexceptionс вбрасываются намеренно, или вы действительно еще не реализованы эти методы. Если вы бросаете, чтобы указать, что конкретная реализация не поддерживает эту функциональность, это еще один сигнал, что эти две реализации не совсем разные стратегии для одной задачи.

4
ответ дан 5 июля 2011 в 02:07 Источник Поделиться

Дизайн-это неправильно.
Допустим у нас есть класс:

    public class SomeClass
{
public void DoSomethingWithDb(OracleDBContext dbContext)
{
dbContext.ConnectToDatabase();
var dataSet = dbContext.DatabaseQuery("some procedure", "some parameters");
dbContext.DisconnectFromDatabase();
}
}

Что мы получаем, когда мы используем этот класс такой:

        var dbContext = new OracleDBContext(new EmailTableClass(), "Email");
var someClass = new SomeClass();
someClass.DoSomethingWithDb(dbContext);

Мы получим исключение notimplementedexception.
Кстати, судя по названиям классов, я могу предположить, что мы получим ошибку, если мы пишем:

var dbContext = new OracleDBContext(new EmailTableClass(), "Ph");

Я бы:
1. Сделать EmailTableClass: OracleDBContext и PhTableClass: OracleDBContext
2. Удалить DatabaseQuery способ(строку запроса, объекта oracleconnection объекта oracleconnection) от PhTableClass и DatabaseQuery способ(порядок строк, строковые параметры, объекта oracleconnection объекта oracleconnection) от EmailTableClass.
3. Переместить имена таблиц EmailTableClass и PhTableClass.

0
ответ дан 5 августа 2011 в 12:08 Источник Поделиться