Databasanslutningar till olika databaser i ASP.Net Core
Jag håller på att utveckla ett nytt API i ASP.Net Core som ska ersätta ett befintligt PHP-baserat API.
Alla kunder har en egen databas (MySql) och jag använder Basic Authentication för att identifiera användaren/kunden och hämtar dennes databasuppgifter från en central databas.
I Startup.cs har jag lagt till min databasklass som en Singleton
services.AddSingleton<IDbConnection, MySqlConnection>();
och det är denna instans av MySqlConnection-klassen jag använder för att hämta kundens inloggningsuppgifter från den centrala databasen och för att ansluta och hämta data från kundens databas.
Så här ser MySqlConnection-klassen ut (jag har tagit bort övriga CRUD-funktioner förutom Get):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using API.Db.Interfaces;
using API.Helpers;
using Dapper;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace API.Db
{
public class MySqlConnection : ControllerBase, IDbConnection
{
private readonly IHttpContextAccessor _context;
public MySqlConnection(IHttpContextAccessor context)
{
_context = context;
if (context.HttpContext == null) throw new Exception("No content...");
SimpleCRUD.SetDialect(SimpleCRUD.Dialect.MySQL);
}
public T Get<T>(int id)
{
using System.Data.IDbConnection connection = new MySql.Data.MySqlClient.MySqlConnection(ConnectionString());
return connection.Get<T>(id);
}
private string ConnectionString()
{
var apiUser = GetApiUser(_context.HttpContext?.Request.Headers);
return $"Server={apiUser.DbHost};Database={apiUser.DbDatabase};Uid={apiUser.DbUser};Pwd={apiUser.DbPwd};Port={apiUser.DbPort}";
}
private static ApiUserModel GetApiUser(IHeaderDictionary headers)
{
var authHeader = AuthenticationHeaderValue.Parse(headers["Authorization"]);
var credentialsByes = Convert.FromBase64String(authHeader.Parameter ?? string.Empty);
var credentials = Encoding.UTF8.GetString(credentialsByes).Split(':');
var username = credentials[0];
var password = credentials[1];
using System.Data.IDbConnection connection = new MySql.Data.MySqlClient.MySqlConnection("Server=db.exempel.se;Port=3306;Database=ApiAccounts;Uid=användarnamn;Pwd=lösenord;");
var user = connection.Query<ApiUserModel>("SELECT * FROM users WHERE username = @Username AND password = @Password;",
new
{
Username = username,
Password = password
}).SingleOrDefault();
return user;
}
}
}
Är detta ett korrekt sätt att implementera anslutningar för olika databaser eller var har jag tänkt fel?
MSI PRO Z790-P WIFI | Intel i9 13900K | 128 GB DDR5
NVIDIA GeForce GTX 4070 12 GB
WD Black SN850X 2 TB Gen 4 | 2 x 1 TB Samsung 970 EVO Plus
3 x ASUS 27" | 1 x Philips 49"