2015-09-20 3 views
0

Я пытаюсь создать общий уровень данных для подключения ко всей общей базе данных. Поэтому я начал с создания класса DbFactory.Общие идеи реализации DbFactory

Что я должен делать, создавая эту фабрику, такую ​​как масштабируемость, производительность, безопасность, объединение пулов и повторное использование. Пожалуйста, порекомендуйте.

Вот что я начал:

public class DbFactory 
{ 
    private DbConnection _dbConnection; 

    public DbConnection GetDbConnection(DbType type) 
    { 
     switch (type) 
     { 
      case (DbType.Oracle): 
       _dbConnection = new OracleConnection(); 
       break; 
      case (DbType.SqlServer): 
       _dbConnection = new SqlConnection(); 
       break; 
      case (DbType.Excel): 
       _dbConnection = new OleDbConnection(); 
       break; 
      case (DbType.Other): 
       _dbConnection = new OdbcConnection(); 
       break; 
      default: 
       _dbConnection = new OdbcConnection(); 
       break; 
     } 

     return _dbConnection; 
    } 

    public enum DbType 
    { 
     SqlServer, 
     Oracle, 
     Excel, 
     Other 
    } 
} 
+0

Я предлагаю вам взглянуть на DbProviderFactories: https://msdn.microsoft.com/en-us/library/dd0w4a2z(v=vs.110).aspx – Joe

ответ

3

Я бы посоветовал не делать это так. Использование этого способа нарушает SRP и OCP от принципов SOLID как минимум. Это также выглядит как YAGNI.

Лучший способ сделать это было бы создать простой интерфейс, как:

public interface IConnectionFactory 
{ 
    DbConnection GetNewConnection(); 
} 

Вы можете не создавать реализацию для каждого типа базы данных, что вам нужно. Для SQL это будет выглядеть так:

public class SqlConnectionFactory : IConnectionFactory 
{ 
    private readonly string connectionString; 

    public SqlConnectionFactory(string connectionString) 
    { 
     this.connectionString = connectionString; 
    } 

    public DbConnection GetNewConnection() 
    { 
     return new SqlConnection(this.connectionString); 
    } 
} 

В зависимости от текущего приложения вы работаете вы можете придать правильную реализацию, необходимую в данный момент. Например:

public class SomeServiceNeedingDatabaseConnection 
{ 
    private readonly IConnectionFactory connectionFactory; 

    public SomeServiceNeedingDatabaseConnection(IConnectionFactory connectionFactory) 
    { 
      this.connectionFactory = connectionFactory; 
    } 

    public void SomeMethodNeedingDatabase() 
    { 
      using (var connection = this.connectionFactory.GetNewConnection()) 
      { 
       // Do something with connection 
      } 
    } 
} 

Где-то в вашем приложении, наиболее предпочтительно в composition root вашем приложении вы можете создать необходимую реализацию Вашего ConnectionFactory.

+0

Спасибо за подробное объяснение ... –

 Смежные вопросы

  • Нет связанных вопросов^_^