2009-09-27 12 views
6

Qualcuno può aiutare?Unity (dipendenza da iniezione): come passare un parametro al costruttore in RegisterType

ho un app WPF (non dovrebbe importare) e nel OnStart ho la mia roba bootstrap .. E 'come questo ..

 // Create unity container my service and repository 
     container = new UnityContainer() 
      .RegisterType<ISecurityRepository, SecurityRepository>() 
      .RegisterType<ISecurityService, SecurityService>(); 

Fondamentalmente ISecurityService aspetta me di passare in un ISecurityRepository, da cui il sopra fallisce.

Ma io sono poco confuso, devo creare un nuovo IsecurityRespository e quindi passarlo, questo sconfigge l'oggetto no?

C'è comunque un messaggio "passaggio in SecurityService the ISecurityRepository dal contenitore", ma non è stato ancora creato?

Qualche idea?

+0

Puoi pubblicare la definizione del costruttore della tua classe di servizio? –

+0

Ciao Lasse, ho aggiunto l'informazione –

risposta

4

Non è necessario creare prima le istanze. Funziona tutto bene. Questa è la magia dei contenitori IoC.

Esempio:

public interface ISecurityService { } 
public interface ISecurityRepository { } 

public class SecurityService : ISecurityService 
{ 
    public SecurityService(ISecurityRepository repository) 
    { 
     Console.WriteLine("SecurityService created"); 
     Console.WriteLine("Repository is " + repository); 
    } 

    public override string ToString() 
    { 
     return "A SecurityService"; 
    } 
} 

public class SecurityRepository : ISecurityRepository 
{ 
    public SecurityRepository() 
    { 
     Console.WriteLine("SecurityRepository created"); 
    } 

    public override string ToString() 
    { 
     return "A SecurityRepository"; 
    } 
} 

public class MyClassThatNeedsSecurity 
{ 
    public MyClassThatNeedsSecurity(ISecurityService security) 
    { 
     Console.WriteLine("My class has security: " + security); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     using (IUnityContainer container = new UnityContainer()) 
     { 
      container.RegisterType<ISecurityRepository, SecurityRepository>() 
        .RegisterType<ISecurityService, SecurityService>(); 

      MyClassThatNeedsSecurity myClass = 
       container.Resolve<MyClassThatNeedsSecurity>(); 
     } 
    } 
} 

Questo stamperà:

SecurityRepository created 
SecurityService created 
Repository is A SecurityRepository 
My class has security: A SecurityService

Si dispone di un certo numero di opzioni, come la pre-creazione di istanze (come mostrato nel tuo post di follow-up) o estendere la durata delle dipendenze iniettate in modo che non vengano ricreate ogni volta che sono necessarie. Ma per il caso base, funzionerà.

+1

Grazie a TrueWill! Ha funzionato, quindi vedi se ho capito bene, usando registerTypes creerai una nuova istanza ogni volta che risolvo? e usare la mia strada nel mio follow-up usa la stessa istanza ogni volta che uso la risoluzione? Quindi suppongo che se è necessario mantenere vivo un oggetto è meglio usare RegisterInstance piuttosto che registerType? –

+1

@mark: Sì, con la chiamata RegisterType predefinita verrà creata una nuova istanza ogni volta che si chiama Resolve ** e ** il tipo risolto ha bisogno della dipendenza (direttamente o indirettamente). L'uso di RegisterInstance darà sempre la stessa istanza. Puoi anche utilizzare gli overload per fare in modo che Unity crei l'istanza una volta sola e per contenitore (come un Singleton); dalla guida di Unity: "myContainer.RegisterType (new ContainerControlledLifetimeManager());" – TrueWill

+0

Grazie! .. ottimo aiuto .. –

1

ecco alcune ulteriori informazioni. Il costruttore della mia classe è

public SecurityService(ISecurityRepository repository) 
     : base(repository) 
    { 

    } 

Dopo aver suonato in giro un po ', sono riuscito a fare quanto segue, ma questo mi fa creare istanze PRIMA ... Sembra funzionare .., ma la sua alternativa.

 // Create unity container my service and repository 
     ISecurityRepository securityRepository = new SecurityRepository(); 
     ISecurityService securityService = new SecurityService(securityRepository); 

     container = new UnityContainer(); 
     container.RegisterInstance<ISecurityRepository>(securityRepository); 
     container.RegisterInstance<ISecurityService>(securityService); 
+0

, cosa dovremmo fare se ci sono più costruttori di classe di servizio? Si prega di consultare il seguente problema: - http://stackoverflow.com/questions/23443921/how-to-register-service-class-with-multiple-repository-types-in-bootstrapper-fil?noredirect=1#comment35940994_23443921 – Pawan

Problemi correlati