2009-09-02 6 views
3

Quand jeUnity - InjectionProperty donne des propriétés nulles?

container.RegisterType<IInterface, MyClass>(); 

tout fonctionne, et toutes les propriétés dépendantes annotés avec:

[Dependency] 

sont résolus à travers le récipient. Mais, j'ai maintenant une propriété int que je voudrais aussi résoudre à travers le conteneur. Ce n'est pas passé dans le constructeur, mais juste comme une propriété publique. J'ai donc essayé ceci:

container.RegisterType<IInterface, MyClass>(
    new InjectionProperty("PropertyName", 1) 
); 

Maintenant que la propriété s'injecté, mais toutes les autres propriétés annotées avec [dépendance] sont nuls et non résolus. Si j'utilise InjectionProperty pour une propriété, dois-je maintenant déclarer explicitement toutes les autres propriétés qui ont l'attribut [Dependency] ?? Ou y a-t-il une meilleure façon de faire cela?

Merci.

Répondre

1

L'enregistrement des propriétés avec l'API (runtime) annulera les attributs [Dependency]. Vous ne pouvez pas utiliser les deux. Mais vous pouvez utiliser la réflexion pour obtenir des propriétés décorées avec l'attribut [Dependency] et les enregistrer au moment de l'exécution.

6

Bien que @najmeddine soit correct, vous pouvez toujours effectuer les opérations suivantes.

Votre composant:

public class Service : IService 
{ 
    [Dependency("Key")] 
    public Int32 Value { get; set; } 
} 

Inscription:

IUnityContainer unity = new UnityContainer() 
    .RegisterType<IService, Service>() 
    .RegisterInstance("Key", 2010) 

L'utilisation est simple.

Si maintenant vous utilisez Unity 2.0 ou supérieur (qui n'a pas été disponible pour vous) et si vous avez besoin d'injecter différentes valeurs dans différents domaines (contextes bornés) de votre application, utilisez les hiérarchies de conteneurs:

IUnityContainer child = unity.CreateChildContainer() 
    .RegisterInstance("Key", 1900); 

Et résolvez vos composants sur child Unity Container.

En savoir plus sur les hiérarchies de conteneurs: http://msdn.microsoft.com/en-us/library/ff660895(PandP.20).aspx

0

Comme Najmeddine dit, les inscriptions InjectionProperty remplacent les attributs [Dependency] ... Vous pouvez cependant utiliser encore les pour ne pas remplacer les attributs [Dependency] objets InjectionMethod.

je construit mes objets avec des méthodes "Remplacer" en option:

class SomeObject 
{ 
    [Dependency("Value")] 
    public string Value { get; set; } 

    public void OverrideValue(string value) 
    { 
     this.Value = value; 
    } 
} 

normal DI fonctionnerait comme suit:

container.RegisterInstance<string>("Value", "Default Value"); 

container.Resolve<SomeObject>(); 

Avec une valeur surchargée, vous procédez comme suit:

container.RegisterType<SomeObject>("NotDefault", new InjectionMethod("OverrideValue", "Other Value")); 

container.Resolve<SomeObject>("NotDefault"); 

Je viens de l'écrire sur le dessus de ma tête, alors je m'excuse pour les fautes de frappe à l'avance. (Si vous en trouvez, faites un commentaire et je serai heureux d'ajuster ma réponse.)

Questions connexes