Ich habe eine .net-Core-API, die verschiedene dbcontexts mit verschiedenen Datenbanken verwenden.eingepackte Scoped-Klasse mit mehreren dbcontexts
Ich habe geschrieben eine Klasse, die alle dbcontexts Wraps:
public class BoundedContext : IDisposable
{
public EcommerceDbContext EcommerceContext { get; }
public SecurityDbContext SecurityContext { get; }
public CRMDbContext CrmContext { get; }
public BoundedContext(string EcommerceConnectionString,
string SecurityConnectionString,
string CRMConnectionString)
{
EcommerceContext = new EcommerceDbContext(EcommerceConnectionString);
SecurityContext = new SecurityDbContext(SecurityConnectionString);
CrmContext = new CRMDbContext(CRMConnectionString);
}
public void SaveChanges()
{
if (SecurityContext != null)
SecurityContext.SaveChanges();
if (CrmContext != null)
CrmContext.SaveChanges();
if (EcommerceContext != null)
EcommerceContext.SaveChanges();
}
public void Dispose()
{
if (SecurityContext != null)
SecurityContext.Dispose();
if (CrmContext != null)
CrmContext.Dispose();
if (EcommerceContext != null)
EcommerceContext.Dispose();
}
}
In der Startklasse I es als scoped Instanz definiert haben:
services.AddScoped((_) => new BoundedContext(Configuration["Data:Ecommerce:ConnectionString"],
Configuration["Data:Security:ConnectionString"],
Configuration["Data:CRM:ConnectionString"]));
Controller Aktionen sind eine statische Klasse aufrufen ein Passieren oder mehrere "Befehle", so dass diese Klasse dafür verantwortlich ist, sie auszuführen und die Änderungen zu bestätigen
Ich habe ein .net Kernnetz, das diese API mit einem sdk aufruft, das von swagger erzeugt wird. Die Controller der Bahn haben einen Filter, um die Eigenschaften des angemeldeten Benutzers zu erhalten:
public override void OnActionExecuting(ActionExecutingContext context)
{
if (User.Identity.IsAuthenticated)
{
if (_currentUser == null)
{
_currentUser = ApiHandler.GetCurrentUser(_applicationId, _accessToken);
}
return _currentUser;
}
return null;
}
und eine Probe einer Aktion:
// GET: /<controller>/
[HttpGet("{All}")]
public async Task<IActionResult> Index([FromRoute]string All)
{
GetNotificationResponse result = await ControllerHandler.GetNotifications(All, _accessToken());
return PartialView("~/Views/Notifications/v1/NotificationsList.cshtml",result);
}
Wir nennen diese Aktionen mit einem Jquery Ajax-Aufruf. Das Problem ist, dass wir manchmal eine System.ObjectDisposedException in der "OnActionExecuting" erhalten, aber ich weiß nicht warum, weil die Klasse, die die dbcontexts verwaltet, mit der Bereichsoption injiziert wird.
Glauben Sie, dass diese Architektur schlecht ist oder fehlt mir etwas?