Iniettore semplice registrazione manuale dei controller
-
20-12-2019 - |
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()));
}
. 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;
.