Last active
August 16, 2022 04:55
-
-
Save jtabuloc/e595b6614c691bc8fc27b7e069cfa987 to your computer and use it in GitHub Desktop.
Multiple Sql databases with one interface using factory pattern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.Extensions.DependencyInjection; | |
using System; | |
namespace GenericSqlDatabseServiceFactory | |
{ | |
internal class Program | |
{ | |
static void Main(string[] args) | |
{ | |
var serviceCollection = new ServiceCollection(); | |
serviceCollection.RegisterSqlFactory(); | |
var provider = serviceCollection.BuildServiceProvider(); | |
var sqlFactory = provider.GetService<ISqlDatabaseFactory>(); | |
var mySql = sqlFactory.CreateSql(SqlType.MySql); | |
var msSql = sqlFactory.CreateSql(SqlType.MsSql); | |
var postgre = sqlFactory.CreateSql(SqlType.Postgre); | |
Console.WriteLine($"Database Type : {mySql.DatabaseName}, Connectionstring: {mySql.Connecionstring}"); | |
Console.WriteLine($"Database Type : {msSql.DatabaseName}, Connectionstring: {msSql.Connecionstring}"); | |
Console.WriteLine($"Database Type : {postgre.DatabaseName}, Connectionstring: {postgre.Connecionstring}"); | |
Console.ReadKey(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.Extensions.DependencyInjection; | |
using Microsoft.Extensions.Options; | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
namespace GenericSqlDatabseServiceFactory | |
{ | |
// Service Collection Extensions | |
public static class ServiceFactoryExtensions | |
{ | |
public static void RegisterSqlFactory(this IServiceCollection serviceCollection) | |
{ | |
serviceCollection.Configure<MsSqlOption>(option => option.ConnectionString = "Mssql connection string"); | |
serviceCollection.Configure<MySqlOption>(option => option.ConnectionString = "Mysql connection string"); | |
serviceCollection.Configure<PostgreOption>(option => option.ConnectionString = "Postgrel connection string"); | |
serviceCollection.AddSingleton<ISqlDatabase, MsSql>(); | |
serviceCollection.AddSingleton<ISqlDatabase, Postgre>(); | |
serviceCollection.AddSingleton<ISqlDatabase, MySql>(); | |
serviceCollection.AddSingleton<Func<IEnumerable<ISqlDatabase>>>(serviceProvider => () => serviceProvider.GetService<IEnumerable<ISqlDatabase>>()); | |
serviceCollection.AddSingleton<ISqlDatabaseFactory, SqlDatabaseFactory>(); | |
} | |
} | |
public class PostgreOption | |
{ | |
public string ConnectionString { get; set; } | |
} | |
public class MySqlOption | |
{ | |
public string ConnectionString { get; set; } | |
} | |
public class MsSqlOption | |
{ | |
public string ConnectionString { get; set; } | |
} | |
public interface ISqlDatabaseFactory | |
{ | |
ISqlDatabase CreateSql(SqlType sqlType); | |
} | |
public class SqlDatabaseFactory : ISqlDatabaseFactory | |
{ | |
private readonly Func<IEnumerable<ISqlDatabase>> _factory; | |
public SqlDatabaseFactory(Func<IEnumerable<ISqlDatabase>> factory) | |
{ | |
_factory = factory; | |
} | |
public ISqlDatabase CreateSql(SqlType sqlType) | |
{ | |
var databases = _factory(); | |
var sqlDatabase = databases.FirstOrDefault(x => x.DatabaseName == sqlType); | |
if (sqlDatabase == null) | |
throw new NotImplementedException($"Sql type {nameof(sqlType)} is not implemented"); | |
return sqlDatabase; | |
} | |
} | |
public class MsSql : ISqlDatabase | |
{ | |
public SqlType DatabaseName => SqlType.MsSql; | |
public string Connecionstring { get; private set; } | |
public MsSql(IOptions<MsSqlOption> option) | |
{ | |
Connecionstring = option.Value.ConnectionString; | |
} | |
} | |
public class Postgre : ISqlDatabase | |
{ | |
public SqlType DatabaseName => SqlType.Postgre; | |
public string Connecionstring { get; private set; } | |
public Postgre(IOptions<PostgreOption> option) | |
{ | |
Connecionstring = option.Value.ConnectionString; | |
} | |
} | |
public class MySql : ISqlDatabase | |
{ | |
public SqlType DatabaseName => SqlType.MySql; | |
public string Connecionstring { get; private set; } | |
public MySql(IOptions<MySqlOption> option) | |
{ | |
Connecionstring = option.Value.ConnectionString; | |
} | |
} | |
public interface ISqlDatabase | |
{ | |
string Connecionstring { get; } | |
SqlType DatabaseName { get; } | |
} | |
public enum SqlType | |
{ | |
MsSql, | |
Postgre, | |
MySql | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment