Domanda

Sto tentando di implementare l'iniezione di dipendenza nella mia architettura (MVC, DDD - Modello di dominio, repository). E la mia architettura include Identity ASP.NET 2.0.

In questa fase, non voglio di controllare nessuno degli oggetti Identity 2.0 (USERADMincontroller, RoledMinController ...). Preferirei gli oggetti di sicurezza al di fuori di di. In questa fase, integrando gli oggetti di identità in cui sembra molto difficile. Ho avuto un bell'aspetto per vedere se qualcuno lo ha già fatto, quindi potrei leggere e imparare come farlo. Non riuscivo a trovare nulla. (Trovato un post che è venuto vicino, ma nessuna risoluzione).

Comunque, ho seguito la semplice implementazione dell'Iniettore MVC (vedi il codice standard sotto), e provando molte cose, credo che il problema sia in me chiamato RegisterMvcControllers .

Correggimi se ho torto, ma questa affermazione prendetterà tutti i controller con il loro nome post-fissato con "controller".

Domanda: Come posso selezionare quali controller vengono registrati con semplice iniettore? (È chiamato registrato manualmente?)

Qualsiasi aiuto sarebbe molto apprezzato, dato che ho trascorso la maggior parte di oggi cercando di ottenere la mia testa intorno a tutto questo, e procedere al prossimo passo, cioè di essere implementato e istanziando i miei oggetti.

...

...

... chiamato da 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()));
    }
.

È stato utile?

Soluzione

Il RegisterMvcControllers registrerà i seguenti tipi:

    .
  • Il tipo deve essere pubblico
  • Il tipo deve implementare System.Web.Mvc.IController
  • Il tipo non deve essere astratto
  • Il tipo non deve essere una definizione di tipo generica
  • Il suo nome deve terminare con "controller"

Puoi vedere cosa succede qui nel codice sorgente .

Il metodo di estensione RegisterMvcControllers chiama nel metodo SimpleInjectorMvcExtensions.GetControllerTypesToRegister per ottenere l'elenco dei controller da registrarsi. Puoi chiamare quel metodo da solo per vedere cosa è registrato come segue:

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

Quindi invece di chiamare RegisterMvcControllers puoi registrare i controller stessi chiamando il metodo GetControllerTypesToRegister:

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

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

In questo modo è possibile filtrare qualsiasi controller che si desidera registrare manualmente:

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

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

Un'altra opzione è ignorare la registrazione:

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;
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top