Injektionsabhängigkeit:Bringen Sie Ihren eigenen Container in die .NET Core-Konsolen-App, beispielsweise mit Simple Injector

 C Programming >> C-Programmierung >  >> Tags >> .NET
Injektionsabhängigkeit:Bringen Sie Ihren eigenen Container in die .NET Core-Konsolen-App, beispielsweise mit Simple Injector

Einführung des einfachen Injektors

Simple Injector ist eine benutzerfreundliche Dependency Injection (DI)-Bibliothek für .NET, die .NET Core-, Xamarin-, Mono- und Universal-Apps unterstützt. Simple Injector lässt sich problemlos in Frameworks wie Web-API, MVC, WCF, ASP.NET Core und viele andere integrieren. Es ist einfach, das Abhängigkeitsinjektionsmuster mit lose gekoppelten Komponenten mit Simple Injector zu implementieren.

Warum einfacher Injektor? Es ist einfach zu verwenden, kostenlos, schnell, unterstützt erweiterte generische Typen und bietet leistungsstarke Diagnosedienste.

Wenn Sie mehr darüber erfahren möchten, können Sie die Dokumentation hier einsehen:https://simpleinjector.readthedocs.io/en/latest/quickstart.html

Installation von Simple Injector in einer Konsolen-App

Wählen Sie es aus und installieren Sie es unter „Nuget-Pakete verwalten“ Bedienfeld

oder geben Sie den folgenden Befehl in "Paketverwaltungskonsole" ein :

PM> Install-Package SimpleInjector -Version 4.0.12

Konfiguration von Simple Injector in einer Konsolen-App

  • Importieren Sie SimpleInjector und SimpleInjector.Lifestyles Namensräume
  • Fügen Sie einen statischen Container hinzu Eigenschaft in Ihrem Klassen-Programm
  • Registrieren Sie Ihren Dienst mit der entsprechenden Schnittstelle , Einfacher Injektor unterstützt Betoninjektion (die Klasse ohne ihre Schnittstelle)
  • Fügen Sie optional Bestätigen hinzu Methode, es iteriert den registrierten Dienst, um zu prüfen, ob etwas nicht korrekt ist, und löst eine Ausnahme aus, bevor das Programm ausgeführt wird
  • Verwenden Sie dann GetInstance Methode, um Ihren Service zu erhalten

Beispiel:

public interface IMyService
{
   string HelloWorld();
}
public class MyService: IMyService
{
   public string HelloWorld()
   {
      return "Hello world!";
   }
}
using SimpleInjector;
using System;

namespace ConsoleAppDemoWithSimpleInjector
{
   class Program
   {
      static readonly Container container;

      static Program()
      {
         container = new Container();

         container.Register<IMyService, MyService>();

         container.Verify();
      }

      static void Main(string[] args)
      {
         var service = container.GetInstance<IMyService>();
         Console.WriteLine(service.HelloWorld());
         Console.ReadLine();
      }
   }
}

Ausführung:

Konfiguration von Simple Injector in einer Konsolen-App, die unbegrenzt läuft

Wenn kein Framework-Code vorhanden ist, sind Sie selbst dafür verantwortlich, Simple Injector mitzuteilen, dass bestimmter Code isoliert ausgeführt werden muss. Dies kann mit Scoping erfolgen. Es gibt zwei Arten von bereichsbezogenen Lebensstilen, die verwendet werden können. ThreadScopedLifestyle ermöglicht das Umschließen von Code, der auf einem einzelnen Thread in einem Bereich ausgeführt wird, während AsyncScopedLifestyle das Umschließen eines Codeblocks ermöglicht, der asynchron fließt (unter Verwendung von async await).

Das folgende Beispiel zeigt eine einfache Konsolenanwendung, die unbegrenzt läuft und jede Sekunde eine Anforderung ausführt. Die Anfrage wird in einen Geltungsbereich eingeschlossen:

class Program
{
   static readonly Container container;

   static Program()
   {
      container = new Container();
      container.Options.DefaultScopedLifestyle = new ThreadScopedLifestyle();

      container.Register<IMyService, MyService>();

      container.Verify();
   }

   static void Main(string[] args)
   {
      while (true)
      {
         using (ThreadScopedLifestyle.BeginScope(container))
         {
            var service = container.GetInstance<IMyService>();

            Console.WriteLine(service.HelloWorld());
         }

         Thread.Sleep(TimeSpan.FromSeconds(1));
      }
   }
}

Standardmäßig ist der Lebenszyklus unseres Dienstes Vorübergehend, Das bedeutet, dass jedes Mal, wenn wir eine Instanz unseres Dienstes anfordern, eine neue Instanz erstellt wird. Andernfalls können Sie Singleton festlegen .

Vorübergehender Lebensstil

container.Register<IMyService, MyService>(Lifestyle.Transient);

oder

container.Register<IMyService, MyService>();

Singleton-Lebensstil

container.Register<IMyService, MyService>(Lifestyle.Singleton);

Beispiel, das Guid anzeigt der Instanz:

public class MyService: IMyService
{
   private Guid _guid;

   public MyService()
   {
      _guid = Guid.NewGuid();
   }

   public string HelloWorld()
   {
      return $"Hello world! instance: {_guid}";
   }
}

Ausführung :

Vorübergehender Lebensstil

Leitfaden sind nicht identisch

Singleton-Lebensstil

Leitfaden sind identisch

Einfach ist es? 🙂