2009-09-27 6 views
6

Kann jemand helfen?Unity (Abhängigkeitsinjektion): Wie übergibt man einen Parameter an den Konstruktor in RegisterType

Ich habe eine WPF-Anwendung (sollte keine Rolle spielen) und in der OnStart ich habe meine Bootstrap Sachen .. Es ist wie dieses ..

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

Grundsätzlich ISecurityService mich in einem ISecurityRepository passieren erwartet, daher der oben schlägt fehl.

Aber ich bin ein wenig verwirrt, muss ich ein neues IsecurityRespository erstellen und es dann übergeben, das besiegt das Objekt nicht wahr?

Gibt es trotzdem, ich sage "Sicherheitsdienst das ISecurityRepository aus dem Container", aber es wurde noch nicht gebaut?

Irgendwelche Ideen?

+0

Können Sie die Konstruktordefinition Ihrer Serviceklasse veröffentlichen? –

+0

Hallo Lasse, ich habe die Information –

Antwort

4

Sie müssen zunächst keine Instanzen erstellen. Es funktioniert einfach. Das ist die Magie von IoC Containern.

Beispiel:

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

Dies drucken:

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

Sie haben eine Reihe von Optionen, wie die Instanzen vor schöpf (wie Sie in Ihrer Follow-up-Post zeigten) oder Verlängerung der Lebensdauer von injizierten Abhängigkeiten, damit sie nicht jedes Mal neu erstellt werden, wenn sie benötigt werden. Aber für den Basisfall wird das funktionieren.

+1

Thans TrueWill! Das hat funktioniert. Also, wenn ich das richtig verstehe, erzeugt die Verwendung von registerTypes jedes Mal, wenn ich Resolve mache, eine neue Instanz. und benutze meinen weg in meinem followup verwendet die gleiche instanz jedes mal wenn ich lösung verwende? Wenn also ein Objekt am Leben gehalten werden soll, ist es besser, RegisterInstance anstelle von registerType zu verwenden. –

+1

@mark: Ja, mit dem Standard-Aufruf von RegisterType wird bei jedem Aufruf von Resolve eine neue Instanz erstellt ** und ** der aufgelöste Typ benötigt die Abhängigkeit (direkt oder indirekt). Wenn Sie RegisterInstance verwenden, wird jedes Mal dieselbe Instanz angezeigt. Sie können die Überladungen auch verwenden, damit Unity die Instanz einmal und nur einmal pro Container erstellt (wie bei einem Singleton). aus der Unity-Hilfe: "myContainer.RegisterType (neuer ContainerControlledLifetimeManager());" – TrueWill

+0

Danke! .. große Hilfe .. –

1

hier ist ein paar weitere Informationen. Der Konstruktor meiner Klasse

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

    } 

Nachdem um ein wenig zu spielen, konnte ich die folgenden tun, aber das verursacht mir Instanzen erstellen FIRST ... Es scheint, .. zu arbeiten, aber es ist eine Alternative.

 // 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

hinzugefügt, was wir tun sollten, wenn es mehrere Konstruktoren der Serviceklasse gibt? Bitte beachten Sie das folgende Problem: - http://stackoverflow.com/questions/23443921/how-to-register-service-class-with-multiple-repository-types-in-bootstrapper-fil?noredirect=1#comment35940994_23443921 – Pawan

Verwandte Themen