Ich bin verwirrt über den richtigen Weg, um meine DbContext
Lebensdauer mit Dependency-Injektion in meiner WinForms-Anwendung zu verwalten. Gerade jetzt, ich habe Code, der wie folgtDbContext Lifetime mit Dependency Injection
static class Program
{
// This is the main window's controller, which stores all the
// dependencies that are resolved in the composition root and handles
// passing those dependencies to other objects
private static IMainController mainController;
private static void ComposeDependencies
{
UnityContainer container = new UnityContainer();
container.RegisterType<IMyContext, MyContext>();
container.RegisterType<IOrderRepository, OrderRepository>();
container.RegisterType<IOrderService, OrderService>();
mainController = new MainController(
container.Resolve<IOrderService>());
}
}
public class OrderRepository : IOrderRepository
{
private readonly IMyContext context;
public OrderRepository(IMyContext context)
{
this.context = context;
}
}
public class OrderService : IOrderService
{
private readonly IOrderRepository repository;
public OrderService(IOrderRepository repository)
{
this.repository = repository;
}
}
public class MainController
{
private readonly IOrderService orderService;
public MainController(IOrderService orderService)
{
this.orderService = orderService;
}
public void DoSomethingWithAnOrder()
{
FirstTypeOfController controller = new FirstTypeOfController(this.orderService);
// Show window, assign controller, etc.
}
public void DoSomethingElseWithAnOrder()
{
SecondTypeOfController controller = new SecondTypeOfController(this.orderService);
// Show window, assign controller, etc.
}
}
sieht das Problem, das ich habe, ist, dass dieses Muster Ergebnisse in allen meinen Repositories erstellt wurden, wenn mein Programm gestartet wird, so dass die MyContext
Instanzen bleiben um durch die ganze Programm. Wenn die Datenbank außerhalb meines Programms aktualisiert wird, sieht mein Programm die neuen Daten daher nicht, da MyContext
Verweise auf die Daten verwendet, die es bereits geladen hat.
Wenn dies eine Webanwendung wäre, hätte ich mit jeder Anfrage neue Abhängigkeiten, aber da dies WinForms ist, verstehe ich nicht, wie ich dieses Problem umgehen kann, während ich einen einzigen Kompositionswurzel verwalte und ohne meine Unity-Container rund um mein Programm (oder mit einem statischen Verweis darauf), damit jeder Controller seine eigenen Abhängigkeiten pro Instanz auflösen kann.
Was ist die Standardlösung für dieses Problem, und gibt es etwas, das ich falsch mache mit, wie/wo ich meine Abhängigkeiten komponieren oder meine DbContext
?
Ich weiß, dass MVC mehr für Web-Anwendungen gedacht ist und etwas wie MVVM oder MVP ist vielleicht besser für Nicht-Web geeignet, aber diese hätten das gleiche Problem mit einem einzigen Kompositionsstamm, der nur einmal aufgerufen wird.
Haben Sie es geschafft, dieses Problem zu lösen? –
Ich habe eine Lösung gefunden, aber ich bin mir nicht sicher, ob es so gemacht werden sollte. Ich habe eine 'MyContextFactory' erstellt, die ich als Abhängigkeit in alle meine Repositorys injiziere (anstatt' MyContext' zu injizieren), und dann benutze ich diese Factory, um ein neues 'MyContext'-Objekt innerhalb jeder Methode zu erstellen, die diesen Kontext verwendet. Es funktioniert, aber ich bin besorgt, dass es nicht eine empfohlene Art und Weise ist, damit umzugehen. –