2014-07-14 20 views
23

Unità Dipendenza ho scaricato questo campione in cui posso provare le caratteristiche di Identity Provider in ASP.NET MVC 5:Identity Provider e iniezione

http://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples

che ho usato molte volte Unità DI per i miei repository , servizi, unità di lavoro e altre cose senza problemi.

Ma ora, quando installo Unity DI, ho molti problemi con le interfacce e il DI che utilizza il provider di identità.

Ho appena scaricato il codice dell'esempio e ho configurato l'Unity DI, ma non voglio usare Unity per l'Identity Membership, voglio usare Unity DI solo per me roba (IRepository, IService, IUnitOfWork, ecc)

ho questo errore quando provo a registrare un utente:

Il tipo corrente, Microsoft.AspNet.Identity.IUserStore`1 [Ecoavantis.Interactive.GCI.Models. ApplicationUser], è un'interfaccia e non può essere costruita. Ti manca una mappatura del tipo ?

Ho letto alcuni post in cui mi hanno detto che devo includere qualcosa di simile, ma non ho bisogno di iniettare le dipendenze in Identity Provider ...

container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager()); 
      container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager()); 

Qualcuno mi può aiutare per favore?

Esempio di codice:

/// <summary>Registers the type mappings with the Unity container.</summary> 
     /// <param name="container">The unity container to configure.</param> 
     /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
     /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks> 
     public static void RegisterTypes(IUnityContainer container) 
     { 
      // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. 
      // container.LoadConfiguration(); 
      // TODO: Register your types here 


      //container.RegisterType<DbContext, ApplicationDbContext>(new ContainerControlledLifetimeManager()); 
      container.RegisterType<IUnitOfWorkAsync, UnitOfWork>(new PerRequestLifetimeManager()); 
      container.RegisterType<IMainPanelService, MainPanelService>(); 
      container.RegisterType(typeof (IRepositoryAsync<>), typeof (Repository<>)); 
      container.RegisterType<IDataContextAsync, ecoavantisinteractivegciContext>(new PerRequestLifetimeManager()); 
     } 
+0

Che aspetto ha la classe ApplicationUser? Sta dicendo che è usato come una classe quando è un'interfaccia. Se stai usando un'interfaccia per l'utente dell'applicazione, hai provato a configurare DI per quell'interfaccia e l'implementazione di essa? – grimurd

+0

Sì, ho provato, ma non funziona ... Ho alcune domande simili: http://stackoverflow.com/questions/24731426/register-iauthenticationmanager-with-unity – chemitaxis

risposta

38

Ok, ho risolto il mio problema, ho iniettato le dipendenze con questo metodo, ma non capisco molto bene perché è un lavoro ...

Ora, Identità funziona bene con la mia Unità dI

chemitaxis
container.RegisterType<AccountController>(new InjectionConstructor()); 
container.RegisterType<RolesAdminController>(new InjectionConstructor()); 
container.RegisterType<ManageController>(new InjectionConstructor()); 
container.RegisterType<UsersAdminController>(new InjectionConstructor()); 
+2

(Bit late to the party). Quella direttiva forza l'unità a utilizzare il parametro less constructor (l'oggetto InjectionConstructor è vuoto) durante la creazione di AccountController. Altrimenti Unity proverà a risolvere il costruttore 'più specificato' (e fallirà). – Dribbel

+2

In alternativa, posizionare l'attributo [InjectionConstructor] sul costruttore vuoto in AccountController. –

9

Grazie! Dal momento che non ho abbastanza rappresentanti per commentare, sto postando una nuova risposta. Io parto dal presupposto chemitaxis creati negli ultimi 3 controllori per conto suo perché semplicemente registrando il primo AccountController sembra aver funzionato per me, anche se ho esteso le proprietà User modello:

container.RegisterType<AccountController>(new InjectionConstructor()); 
13

Nel mio caso ho aggiunto quanto segue per UnityConfig .cs nel metodo RegisterComponents.

container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(); 
0

Aggiornamento per la risposta chemitaxis e hvaughan3. Dal momento che dici che succede quando provi a registrare un utente probabilmente è nello standard AccountController. Il problema originale di questo è che l'Unità tenta di chiamare il costruttore con due parametri, ad esempio:

public AccountController(
    ApplicationUserManager userManager, 
    ApplicationSignInManager signInManager) 
{ 
    UserManager = userManager; 
    SignInManager = signInManager; 
} 

La seguente linea dirà Unità di chiamare il costruttore senza parametri, invece, e non avrà bisogno di niente altro.

container.RegisterType<AccountController>(new InjectionConstructor()); 

Spero che questa spiegazione aiuta.

Problemi correlati