Frage

Ich versuche, Dependency Injection in meine Architektur (MVC, DDD – Domain Model, Repository) zu implementieren.Und meine Architektur umfasst ASP.NET Identity 2.0.

Zu diesem Zeitpunkt möchte ich nicht, dass DI eines der Identity 2.0-Objekte (UserAdminController, RolesAdminController ...) steuert.Ich würde die Sicherheitsobjekte außerhalb von DI bevorzugen.Zu diesem Zeitpunkt scheint die Integration der Identitätsobjekte in DI sehr schwierig zu sein.Ich habe genau nachgeschaut, ob das schon jemand gemacht hat, damit ich lesen und lernen konnte, wie man das macht.Ich konnte nichts finden.(Ich habe einen Beitrag gefunden, der nahe dran war, aber keine Lösung).

Wie auch immer, ich habe die Simple Injector MVC-Implementierung befolgt (siehe Standardcode unten) und viele Dinge ausprobiert. Ich glaube, das Problem liegt in meinem Anruf RegisterMvcControllers.

Korrigieren Sie mich, wenn ich falsch liege, aber diese Aussage erfasst alle Controller, deren Namen nachträglich mit „Controller“ versehen sind.

Frage:Wie kann ich auswählen, welche Controller bei Simple Injector registriert werden?(Heisst das manuelle Registrierung?)

Über jede Hilfe wäre ich sehr dankbar, da ich den größten Teil des heutigen Tages damit verbracht habe, mich mit all dem auseinanderzusetzen und mit dem nächsten Schritt fortzufahren, d. h.Habe DI implementiert und meine Objekte instanziiert.

...

...

...aufgerufen von Application_Start()

        // Create a Simple Injector container
        var container = new Container();

        // Configure the container
        InitializeContainer(container);

        container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

        // Verify the container's configuration
        container.Verify();

        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));


    private static void InitializeContainer(Container container)
    {
        container.Register<MyService1>();            

        container.Register<IMyRepositoryA, MyRepositoryA>();

        // Trying to include Identity into Simple Injector - please ignore
        container.Register<IUserStore<ApplicationUser>>(() => new UserStore<ApplicationUser>(new ApplicationDbContext()));
    }
War es hilfreich?

Lösung

Der RegisterMvcControllers registriert die folgenden Typen:

  • Der Typ muss öffentlich sein
  • Der Typ muss implementiert werden System.Web.Mvc.IController
  • Der Typ darf nicht abstrakt sein
  • Der Typ darf keine generische Typdefinition sein
  • Sein Name muss mit „Controller“ enden.

Sie können sehen, was passiert hier im Quellcode.

Der RegisterMvcControllers Erweiterungsmethodenaufrufe in die SimpleInjectorMvcExtensions.GetControllerTypesToRegister Methode, um die Liste der zu registrierenden Controller abzurufen.Sie können diese Methode wie folgt selbst aufrufen, um zu sehen, was registriert wird:

var registeredControllerTypes =
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())

Also statt anzurufen RegisterMvcControllers Sie können die Controller selbst registrieren, indem Sie die anrufen GetControllerTypesToRegister Methode:

var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly());

foreach (var controllerType in registeredControllerTypes)
{
    container.Register(controllerType, controllerType, Lifestyle.Transient);
}

Auf diese Weise können Sie jeden Controller herausfiltern, den Sie manuell registrieren möchten:

var registeredControllerTypes = 
    SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
        container, Assembly.GetExecutingAssembly())
    .Where(type => type.Name != "UserStore`1");

foreach (var controllerType in registeredControllerTypes)
{
    container.Register(controllerType, controllerType, Lifestyle.Transient);
}

Eine andere Möglichkeit besteht darin, die Registrierung zu überschreiben:

container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

container.Options.AllowOverridingRegistrations = true;

container.Register<IUserStore<ApplicationUser>>(
    () => new UserStore<ApplicationUser>(new ApplicationDbContext()))

// Always set the option back to false ASAP to prevent configuration errors.
container.Options.AllowOverridingRegistrations = false;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top