2009-09-27 27 views
6

¿Alguien puede ayudar?Unidad (inyección de dependencia): cómo pasar un parámetro al constructor en RegisterType

tengo una aplicación de WPF (no debe importar) y en el onStart tengo mis cosas de arranque .. Es como esta ..

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

Básicamente ISecurityService espera que yo pase en un ISecurityRepository, de ahí la arriba falla.

Pero estoy un poco confundido, ¿tengo que crear un nuevo IsecurityRespository y luego pasarlo, esto derrota el objeto no?

¿De todos modos digo "pasar a SecurityService el ISecurityRepository desde el contenedor", pero aún no se ha construido?

¿Alguna idea?

+0

¿Puedes publicar la definición del constructor de tu clase de servicio? –

+0

Hola Lasse, he agregado la información –

Respuesta

4

No es necesario crear instancias primero. Todo solo funciona. Esa es la magia de IoC Containers.

Ejemplo:

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

Esto imprimirá:

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

Usted tiene un número de opciones, tales como la creación previa de las instancias (como se mostró en su seguimiento posterior) o extendiendo la vida útil de las dependencias inyectadas para que no se vuelvan a crear cada vez que sean necesarias. Pero para el caso base, esto funcionará.

+1

Thans TrueWill! Eso funcionó, entonces, ¿ven si entiendo esto correctamente? El uso de registerTypes creará una nueva instancia cada vez que lo haga Resolver? y usar mi camino en mi seguimiento utiliza la misma instancia cada vez que uso resolver? Entonces, supongo que si necesita mantener un objeto vivo, es mejor usar RegisterInstance en lugar de registerType? –

+1

@mark: Sí, con la llamada predeterminada de RegisterType se creará una nueva instancia cada vez que llame a Resolve ** y ** el tipo resuelto necesita la dependencia (directa o indirectamente). El uso de RegisterInstance dará la misma instancia cada vez. También puede usar las sobrecargas para que Unity cree la instancia una vez y solo una vez por contenedor (como Singleton); de la ayuda de Unity: "myContainer.RegisterType (new ContainerControlledLifetimeManager());" – TrueWill

+0

¡Gracias! .. gran ayuda .. –

1

Aquí hay algo más de información. El constructor de mi clase es

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

    } 

Después de jugar un poco, he conseguido hacer lo siguiente, pero esto me hace crear instancias PRIMERA ... Parece que funciona .., pero su 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

, ¿qué deberíamos hacer si hay varios constructores de la clase de servicio? Consulte el siguiente problema: - http://stackoverflow.com/questions/23443921/how-to-register-service-class-with-multiple-repository-types-in-bootstrapper-fil?noredirect=1#comment35940994_23443921 – Pawan

Cuestiones relacionadas