vendredi 12 mai 2017

Factory method and IOC registration confusion for different DB provider

I am implementing solution where my application can connect with different database like Oracle,SQL,PLSQL etc.I am using Dapper .Net as an Orm.

I am confused How I can use two different database factory in my repository to get data from two different database

 public interface IDatabaseAbstractionFactory
    {
          IDbConnection CreateOpenConnection();
    }

public class SqlDatabaseFactory : IDatabaseAbstractionFactory
 /// <summary>
        /// 
        /// </summary>
        private readonly string connectionString;


        /// <summary>
        /// 
        /// </summary>
        /// <param name="connectionString"></param>
        public SqlDatabaseFactory(string connectionString)
        {
            this.connectionString = connectionString;
        }

        public  IDbConnection CreateConnection()
        {
            return new SqlConnection(connectionString);
        }
}

public  class OracleDatabaseFactory : IDatabaseAbstractionFactory
    {

        /// <summary>
        /// 
        /// </summary>
        private readonly string connectionString;


        /// <summary>
        /// 
        /// </summary>
        /// <param name="connectionString"></param>
        public OracleDatabaseFactory(string connectionString)
        {
            this.connectionString = connectionString;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public  IDbConnection CreateConnection()
        {
            return new OracleConnection(connectionString);
        }
}

IOC Injection

 public static void RegisterComponents(Microsoft.Practices.Unity.IUnityContainer container)
    {
        container.RegisterType<IDatabaseAbstractionFactory, OracleDatabaseFactory>(new InjectionConstructor(ConfigurationManager.ConnectionStrings["OracleConnnection"].ToString()));

        container.RegisterType<IDatabaseAbstractionFactory, SqlDatabaseFactory>(new InjectionConstructor(ConfigurationManager.ConnectionStrings["SQLConnnection"].ToString()));

        container.RegisterType<IPersonalInfoRepo, PersonalInfoRepoImpl>();

    }

Repository Pattern:

enter code here
public class PersonalInfoRepoImpl: IPersonalInfoRepo
    {


        private readonly IDatabaseAbstractionFactory factory;

        /// <summary>
        /// Creates a new instance of the <see cref="OrderRepository"/> class.
        /// </summary>
        /// <param name="connectionFactory">A connection factory to class. Responsible for opening the connection. </param>
        public PersonalInfoRepoImpl(IDatabaseAbstractionFactory connectionFactory)
        {
            this.factory = connectionFactory;
        }


       public void InsertPersonal(PersonalInfo pp)
        {
            IDatabaseAbstractionFactory factory = new Framework.Core.Connection.SqlDatabaseFactory("ConnectionString");

            using (IDbConnection conn= factory.CreateConnection())
            {

            }

        }

How I can dynamically set connection string in repository so that I don't need to pass it manually .Do I need to define abstraction .How I can improve it.

Aucun commentaire:

Enregistrer un commentaire