2009-09-27 2 views
6

Quelqu'un peut-il aider?Unity (injection de dépendance): Comment passer un paramètre au constructeur dans RegisterType

J'ai une application WPF (ne devrait pas d'importance) et dans le onStart j'ai mes affaires bootstrap .. Son comme ça ..

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

Fondamentalement ISecurityService me attend à passer dans un ISecurityRepository, d'où la ci-dessus échoue.

Mais je suis un peu confus, dois-je créer un nouveau IsecurityRespository et ensuite le transmettre, cela détruit l'objet n'est-ce pas?

Y at-il de toute façon je dis "passer dans SecurityService ISecurityRepository à partir du conteneur", mais il n'a pas encore été construit?

Des idées?

+0

Pouvez-vous publier la définition du constructeur de votre classe de service? –

+0

Salut Lasse, j'ai ajouté l'information –

Répondre

4

Vous n'avez pas besoin de créer d'instances en premier. Tout fonctionne simplement. C'est la magie des conteneurs IoC.

Exemple:

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

Ce imprimera:

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

Vous avez un certain nombre d'options, comme avant la création de vos instances (comme vous montriez dans votre poste de suivi) ou prolonger la durée de vie des dépendances injectées afin qu'elles ne soient pas recréées chaque fois qu'elles sont nécessaires. Mais pour le cas de base, cela fonctionnera.

+1

Thans TrueWill! Cela a fonctionné, alors voyez si je comprends bien ceci, Using registerTypes créera une nouvelle instance chaque fois que je fais Resolve? et en utilisant mon chemin dans mon suivi utilise la même instance chaque fois que j'utilise résoudre? Donc, je suppose que si besoin de garder un objet vivant, il vaut mieux utiliser RegisterInstance plutôt que registerType? –

+1

@mark: Oui, avec l'appel RegisterType par défaut, une nouvelle instance sera créée chaque fois que vous appellerez Resolve ** et ** le type résolu aura besoin de la dépendance (directement ou indirectement). L'utilisation de RegisterInstance donnera la même instance à chaque fois. Vous pouvez également utiliser les surcharges pour que Unity crée l'instance une fois et une seule fois par conteneur (comme un singleton); à partir de l'aide de Unity: "myContainer.RegisterType (nouveau ContainerControlledLifetimeManager());" – TrueWill

+0

Merci! .. grande aide .. –

1

Voici quelques informations supplémentaires. Le constructeur de ma classe est

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

    } 

Après avoir joué un peu, j'ai réussi à faire ce qui suit, mais cela me fait de créer des instances FIRST ... Il semble fonctionner .., mais son 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

, ce que nous devrions faire s'il y a plusieurs constructeurs de classe de service? S'il vous plaît voir le problème ci-dessous: - http://stackoverflow.com/questions/23443921/how-to-register-service-class-with-multiple-repository-types-in-bootstrapper-fil?noredirect=1#comment35940994_23443921 – Pawan

Questions connexes