Ich habe die folgende Klasse in meiner Business-Schicht-Ebene (vereinfachte Code):Unity Kind Container HierarchicalLifetimeManager mvc und Windows-Dienst
public class StatusUpdater : IStatusUpdater
{
private readonly IStatusRepo _statusRepo;
public class StatusUpdater(IStatusRepo statusRepo)
{
_statusRepo = statusRepo;
}
public voic UpdateStatus(int id, string newStatus)
{
_statusRepo.UpdateStatus(id,newStatus);
}
}
So derzeit in der MVC Seite Ich verwende PerRequestLifetimeManager die Lebensdauer zu steuern der DbContext.
Aber jetzt in der Windows-Dienst kann ich das nicht, so würde ich folgendes tun, aber es fühlt sich nicht richtig, weil es viel wie Servicelocator sieht:
using(var container = ConfiguredContainer.CreateChildContainer())
{
var statusUpdater = container.Resolve<IStatusUpdater>();
statusUpdater.UpdateStatus("test");
}
Gibt es noch andere Möglichkeiten? und ist es eine Möglichkeit, den gleichen Code in dem MVC-app und den Windows-Service zu nutzen, ohne dass zwei Arten von Registrierungen:
MVC:
container.RegisterType<IStatusRepo, StatusRepo>(new PerRequestLifetimeManager());
Windows:
container.RegisterType<IStatusRepo, StatusRepo>(new HierarchicalLifetimeManager());
Nicht sicher über "Unity", aber in anderen DI-Frameworks müssten Sie sowieso einen anderen Registrierungscode für 'MVC' und' Win Service' verwenden. Direkte Aufrufe der 'Resolve'-Methode 'riechen' immer, denn dafür sind DI-Frameworks gedacht - um Instanzen zu lösen, wenn ein Bedarf dafür besteht. Wenn wir die '.Resolve'-Methode in unserem Code aufrufen, bedeutet das höchstwahrscheinlich, dass wir etwas falsch machen. Wir können Instanzen in den Konstruktor einfügen und den Lebensdauerbereich des Objekts ändern, das sie stattdessen verwendet. – Fabjan