Question

J'essaie d'implémenter l'injection de dépendances dans mon architecture (MVC, DDD - Domain Model, Repository).Et mon architecture inclut ASP.NET Identity 2.0.

À ce stade, je ne veux pas que DI contrôle aucun des objets Identity 2.0 (UserAdminController, RolesAdminController...).Je préférerais les objets de sécurité en dehors de DI.A ce stade, intégrer les objets Identity dans DI semble très difficile.J'ai bien regardé pour voir si quelqu'un avait déjà fait cela, afin de pouvoir lire et apprendre comment faire cela.Je n'ai rien trouvé.(J'ai trouvé un message qui s'en approchait, mais pas de résolution).

Quoi qu'il en soit, j'ai suivi l'implémentation de Simple Injector MVC (voir le code standard ci-dessous), et en essayant beaucoup de choses, je pense que le problème réside dans mon appel S'inscrireMvcControllers.

Corrigez-moi si je me trompe, mais cette instruction récupérera tous les contrôleurs dont le nom est post-fixé par "contrôleur".

Question:Comment puis-je sélectionner les contrôleurs à enregistrer auprès de Simple Injector ?(Est-ce que cela s'appelle une inscription manuelle ?)

Toute aide serait grandement appréciée, car j'ai passé la majeure partie de la journée à essayer de comprendre tout cela et de passer à l'étape suivante, c'est-à-direfaire implémenter DI et instancier mes objets.

...

...

...appelé depuis 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()));
    }
Était-ce utile?

La solution

Le RegisterMvcControllers enregistrera les types suivants :

  • Le type doit être public
  • Le type doit implémenter System.Web.Mvc.IController
  • Le type ne doit pas être abstrait
  • Le type ne doit pas être une définition de type générique
  • Son nom doit se terminer par "Contrôleur"

Vous pouvez voir ce qui se passe ici dans le code source.

Le RegisterMvcControllers la méthode d'extension appelle dans le SimpleInjectorMvcExtensions.GetControllerTypesToRegister méthode pour obtenir la liste des contrôleurs à enregistrer.Vous pouvez appeler cette méthode vous-même pour voir ce qui est enregistré comme suit :

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

Alors au lieu d'appeler RegisterMvcControllers vous pouvez enregistrer vous-même les contrôleurs en appelant le GetControllerTypesToRegister méthode:

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

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

De cette façon, vous pouvez filtrer tout contrôleur que vous souhaitez enregistrer manuellement :

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

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

Une autre option consiste à remplacer l'enregistrement :

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top