База данных фабричного класса, дизайн - PullRequest
2 голосов
/ 15 октября 2010

Привет, у меня есть этот класс для создания экземпляров классов DAL:

public class Factory
{
    public static T GetInstance<T>() where T : new()
    { 
        return new T();
    }
}

Я хочу, чтобы мое приложение могло использовать несколько баз данных. Я планировал установить базу данных в своем файле web.config, а затем передать эту настройку, возможно, заводскому классу, где он вернет правильный класс DAL. Я думаю, что моя методология в порядке, я просто немного застрял на том, как реализовать это, сохраняя при этом общий характер.

Может быть, что-то вроде этого:

public class Factory
{
    private static readonly string dbType = ConfigurationSettings.Appsettings["SqlServer"];
    public static T GetInstance<T>() where T : new()
    { 
        switch(dbType)
        {
             case "SqlServer":
                return new T(); //Not sure what to put here.
             break;
             case: "MySql":
                return new T(); 
             break;
             default: "No datasource";
        }
    }
}

Если бы кто-нибудь мог помочь или указать мне правильное направление, это было бы здорово.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 15 октября 2010

Не используйте генерики для вашего GetInstance() метода. Пусть все ваши классы доступа к данным реализуют интерфейс, а этот интерфейс будет возвращаемым значением из функции.

public class Factory
{
    private static readonly string dbType = ConfigurationSettings.Appsettings["SqlServer"];
    public static IDataAccess GetInstance()
    { 
        switch(dbType)
        {
             case "SqlServer":
                return new SqlServerDataAccess(); //SqlServerDataAccess should implement IDataAccess
             break;
             case: "MySql":
                return new MySqlDataAccess(); //MySqlDataAccess should implement IDataAccess
             break;
             default: "No datasource";
        }
    }
}

Отдельные интерфейсы от реализации!

3 голосов
/ 15 октября 2010

Вы должны взглянуть на пространство имен System.Data.Common. Это пространство имен использует структуры, такие как DbConnection, DbReader и т. Д., И само использует фабричный метод для создания необходимого DbProvider.

Таким образом, вместо того, чтобы идти по вашему текущему пути, я бы предложил, чтобы текущая структура данных .net сделала подъем за вас. вот быстрый пример.

DbProviderFactory m_factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
    DbConnection m_connection = m_factory.CreateConnection();
    m_connection.ConnectionString = _connstrbldr.ConnectionString;
    m_connection.Open();
    using (DbCommand cmd = m_connection.CreateCommand())
    {
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "";
        cmd.ExecuteNonQuery();
    }

Вызов GetFactory может принять любого провайдера, установленного на компьютере, Oracle, MySql, Sql и т. Д. Вы также можете получить всех провайдеров, установленных на компьютере, вызвав статический DataTable GetFactoryClasses (), который возвращает объект с данными.

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

Написание независимого от поставщика кода в ADO.NET

Я надеюсь, что вы найдете это полезным.

...