Einheit DI auf einem Windows-Dienst, Ist möglich?
Baue ich einen Windows-Dienst zu tun, einige periodische Vorgänge, kann ich mit Unity zu injizieren meine Klassen aus einer anderen Bibliothek vorhanden?
Ich verwenden möchten, mit der [Abhängigkeit] - Attribut für meine Dienste, die Registrierung der Komponenten auf den Einstiegspunkt der windows-Dienst starten.
Beispiel:
static class Program
{
static void Main()
{
ServiceBase[] ServicesToRun;
UnityConfig.RegisterComponents();
ServicesToRun = new ServiceBase[]
{
new EventChecker()
};
ServiceBase.Run(ServicesToRun);
}
}
public static class UnityConfig
{
public static void RegisterComponents()
{
UnityContainer container = new UnityContainer();
container.RegisterType<IEventBL, EventBL>();
}
}
public partial class EventChecker : ServiceBase
{
private Logger LOG = LogManager.GetCurrentClassLogger();
[Dependency]
public Lazy<IEventBL> EventBL { get; set; }
protected override void OnStart(string[] args)
{
var events = EventBL.Value.PendingExecution(1);
}
}
In diesem Szenario die EventBL immer null ist, so ist nicht gelöst, indem die [Abhängigkeit] der Einheit. Es gibt nicht einen Weg, um es zu arbeiten?
Dank!
Lösung Gefunden:
Nach schreiben der Antwort, die ich fand eine mögliche Lösung, Berufung auf build-up-Methode des Containers zu erstellen, die service-Klasse arbeitet:
UnityContainer container = new UnityContainer();
UnityConfig.RegisterComponents(container);
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
container.BuildUp(new EventChecker())
};
ServiceBase.Run(ServicesToRun);
Wenn du keine andere Lösung haben, bitte teilen 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Natürlich können Sie eine DI-Bibliothek, mit deren Hilfe Sie die Windows-Dienste. Beachten Sie, dass im Allgemeinen sollten Sie lieber mit constructor injection. Dies verhindert, dass zeitliche Kopplung und verhindert, dass Ihr code, um eine Abhängigkeit der DI-Bibliothek selbst (die ist ziemlich ironisch, zu haben, müssen die Abhängigkeit von den DI-Bibliothek, da es versucht, Ihnen zu helfen verhindern die starke Kopplung zwischen den Komponenten).
Darüber hinaus sollten Sie lassen Sie einfach die container-Lösung Ihres services. In anderen Worten, nicht die neuen, bis Ihre Dienste von hand, sondern fordern Sie eine neue Instanz aus dem container:
Beachten Sie aber, dass Ihre
EventChecker
aufgelöst wird einmal gespeichert und für die Dauer der Anwendung. Effektiv macht es ein singleton, und mit, dass alle seine Abhängigkeiten wird singletons. Anstatt also, es ist besser, um IhrenServiceBase
Umsetzung Teil der Komposition Wurzel und lösen neue Instanzen vom container jedes mal, wenn Ihr Zeit Brände: