Microsoft.AspNetCore.All : v2.0.3 | डैपर : v1.50.2
मुझे यकीन नहीं है कि मैं सही तरीके से सर्वोत्तम प्रथाओं का उपयोग कर रहा हूं या नहीं, लेकिन कई कनेक्शन स्ट्रिंग्स को संभालने के लिए, मैं इसे इस तरह से कर रहा हूं ।
यदि आपके पास केवल 1 कनेक्शन स्ट्रिंग है तो यह आसान है
Startup.cs
using System.Data;
using System.Data.SqlClient;
namespace DL.SO.Project.Web.UI
{
public class Startup
{
public IConfiguration Configuration { get; private set; }
public void ConfigureServices(IServiceCollection services)
{
string dbConnectionString = this.Configuration.GetConnectionString("dbConnection1");
services.AddTransient<IDbConnection>((sp) => new SqlConnection(dbConnectionString));
services.AddScoped<IDiameterRepository, DiameterRepository>();
}
}
}
DiameterRepository.cs
using Dapper;
using System.Data;
namespace DL.SO.Project.Persistence.Dapper.Repositories
{
public class DiameterRepository : IDiameterRepository
{
private readonly IDbConnection _dbConnection;
public DiameterRepository(IDbConnection dbConnection)
{
_dbConnection = dbConnection;
}
public IEnumerable<Diameter> GetAll()
{
const string sql = @"SELECT * FROM TABLE";
return _dbConnection.Query<Diameter>(sql);
}
}
}
यदि आपके पास 1 से अधिक कनेक्शन स्ट्रिंग हैं तो समस्याएं
चूंकि Dapper
उपयोग करता है IDbConnection
, इसलिए आपको अलग-अलग डेटाबेस कनेक्शन को अलग करने के तरीके के बारे में सोचने की आवश्यकता है।
मैंने IDbConnection
अलग-अलग डेटाबेस कनेक्शनों के अनुरूप कई इंटरफेस, 'इनहेरिट किए गए' , और SqlConnection
अलग-अलग डेटाबेस कनेक्शन स्ट्रिंग्स के साथ इंजेक्ट करने का प्रयास किया Startup
।
यह विफल रहा क्योंकि SqlConnection
विरासत में मिला है DbConnection
, और DbConnection
केवल कक्षा ही नहीं , IDbConnection
अपितु भी Component
। तो आपके कस्टम इंटरफेस सिर्फ SqlConnection
निहितार्थ का उपयोग करने में सक्षम नहीं होंगे ।
मैंने अपनी खुद की DbConnection
क्लास बनाने की भी कोशिश की जो अलग-अलग कनेक्शन स्ट्रिंग लेती है। यह बहुत जटिल है क्योंकि आपको DbConnection
कक्षा से सभी विधियों को लागू करना होगा । आप से मदद खो दिया है SqlConnection
।
मैं आखिर क्या कर रहा हूं
- दौरान
Startup
, मैंने सभी कनेक्शन स्ट्रिंग मानों को एक शब्दकोश में लोड किया। मैंने enum
मैजिक स्ट्रिंग्स से बचने के लिए सभी डेटाबेस कनेक्शन नामों के लिए भी बनाया ।
- मैंने डिक्शनरी को सिंगलटन के रूप में इंजेक्ट किया।
- इंजेक्शन लगाने के बजाय
IDbConnection
, मैंने IDbConnectionFactory
सभी रिपॉजिटरी के लिए क्षणिक के रूप में बनाया और इंजेक्ट किया। अब सभी रिपॉजिटरी के IDbConnectionFactory
बजाय ले IDbConnection
।
- सही कनेक्शन कब चुनें? सभी रिपोजिटरी के निर्माण में! चीजों को साफ करने के लिए, मैंने रिपॉजिटरी बेस क्लास बनाए और बेस क्लास से रिपॉजिटरी विरासत में मिली। सही कनेक्शन स्ट्रिंग चयन बेस कक्षाओं में हो सकता है।
DatabaseConnectionName.cs
namespace DL.SO.Project.Domain.Repositories
{
public enum DatabaseConnectionName
{
Connection1,
Connection2
}
}
IDbConnectionFactory.cs
using System.Data;
namespace DL.SO.Project.Domain.Repositories
{
public interface IDbConnectionFactory
{
IDbConnection CreateDbConnection(DatabaseConnectionName connectionName);
}
}
DapperDbConenctionFactory - मेरा अपना कारखाना कार्यान्वयन
namespace DL.SO.Project.Persistence.Dapper
{
public class DapperDbConnectionFactory : IDbConnectionFactory
{
private readonly IDictionary<DatabaseConnectionName, string> _connectionDict;
public DapperDbConnectionFactory(IDictionary<DatabaseConnectionName, string> connectionDict)
{
_connectionDict = connectionDict;
}
public IDbConnection CreateDbConnection(DatabaseConnectionName connectionName)
{
string connectionString = null;
if (_connectDict.TryGetValue(connectionName, out connectionString))
{
return new SqlConnection(connectionString);
}
throw new ArgumentNullException();
}
}
}
Startup.cs
namespace DL.SO.Project.Web.UI
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
var connectionDict = new Dictionary<DatabaseConnectionName, string>
{
{ DatabaseConnectionName.Connection1, this.Configuration.GetConnectionString("dbConnection1") },
{ DatabaseConnectionName.Connection2, this.Configuration.GetConnectionString("dbConnection2") }
};
services.AddSingleton<IDictionary<DatabaseConnectionName, string>>(connectionDict);
services.AddTransient<IDbConnectionFactory, DapperDbConnectionFactory>();
services.AddScoped<IDiameterRepository, DiameterRepository>();
}
}
}
DiameterRepository.cs
using Dapper;
using System.Data;
namespace DL.SO.Project.Persistence.Dapper.Repositories
{
public class DiameterRepository : DbConnection1RepositoryBase, IDiameterRepository
{
public DiameterRepository(IDbConnectionFactory dbConnectionFactory)
: base(dbConnectionFactory) { }
public IEnumerable<Diameter> GetAll()
{
const string sql = @"SELECT * FROM TABLE";
return base.DbConnection.Query<Diameter>(sql);
}
}
}
DbConnection1RepositoryBase.cs
using System.Data;
using DL.SO.Project.Domain.Repositories;
namespace DL.SO.Project.Persistence.Dapper
{
public abstract class DbConnection1RepositoryBase
{
public IDbConnection DbConnection { get; private set; }
public DbConnection1RepositoryBase(IDbConnectionFactory dbConnectionFactory)
{
this.DbConnection = dbConnectionFactory.CreateDbConnection(DatabaseConnectionName.Connection1);
}
}
}
फिर अन्य रिपॉजिटरी के लिए जिन्हें अन्य कनेक्शनों से बात करने की आवश्यकता है, आप उनके लिए एक अलग रिपॉजिटरी बेस क्लास बना सकते हैं।
using System.Data;
using DL.SO.Project.Domain.Repositories;
namespace DL.SO.Project.Persistence.Dapper
{
public abstract class DbConnection2RepositoryBase
{
public IDbConnection DbConnection { get; private set; }
public DbConnection2RepositoryBase(IDbConnectionFactory dbConnectionFactory)
{
this.DbConnection = dbConnectionFactory.CreateDbConnection(DatabaseConnectionName.Connection2);
}
}
}
using Dapper;
using System.Data;
namespace DL.SO.Project.Persistence.Dapper.Repositories
{
public class ParameterRepository : DbConnection2RepositoryBase, IParameterRepository
{
public ParameterRepository (IDbConnectionFactory dbConnectionFactory)
: base(dbConnectionFactory) { }
public IEnumerable<Parameter> GetAll()
{
const string sql = @"SELECT * FROM TABLE";
return base.DbConnection.Query<Parameter>(sql);
}
}
}
आशा है कि ये सभी मदद करेंगे।