L'Unité Propriété Statique De L'Injection
J'ai deux classes, l'une qui met en place le conteneur par l'inscription de types et qui contient une propriété statique de qui je veux injecter dans. Ma question est la propriété n'est jamais défini par l'injection, donc quand j'ai appeler une méthode sur elle, la propriété est toujours null.
public class ClassOne
{
public void Method()
{
Container.RegisterType<IClass, ClassImplOne>("ImplOne");
Container.RegisterType<IClass, ClassImplTwo>("ImplTwo");
}
}
public static class ClassTwo
{
[Dependency]
public static IClass SomeProperty { get; set; }
public static void SomeOtherMethod()
{
SomeProperty.AnotherMethod();
}
}
Si je supprime la Dépendance de l'attribut et dans ClassOne de faire une simple
ClassTwo.SomeProperty = Container.Resolve<IClass>("ImplOne");
il fonctionne très bien, mais je veux savoir si il est possible de le faire sans explicitement l'affectation d'une valeur à la propriété (c'est-àdire le conteneur d'injection à travers les attributs)?
Edit:
Grâce. J'ai enlevé la statique de la déclaration de ClassTwo et dans ClassOne ajouté RegisterType et de résolution pour ClassTwo, et a également ajouté InjectionProperty:
Container.RegisterType<IClass, ClassImplOne>("ImplOne", new InjectionProperty("SomeProperty"));
mais il ne fonctionne toujours pas :S
OriginalL'auteur clicky | 2013-02-28
Vous devez vous connecter pour publier un commentaire.
L'unité injecter des dépendances lorsque la classe est résolu grâce à l'Unité. Une classe statique ne peut pas être créé, de sorte que l'Unité ne peut pas injecter des dépendances.
Au lieu d'avoir une classe Statique, l'utilisation de l'Unité de résoudre une pseudo-classe singleton (
ContainerControlledLifetimeManager
) de ClassTwo. De cette façon, l'Unité injecteIClass
àClassTwo
quandClassTwo
est créé (résolu par l'Unité de conteneur), et comme il est configuré en tant que singleton, vous avez toujours la même instace deClassTwo
dans l'ensemble de la lifecicle de votre application.Vous devez résoudre ClassTwo, grâce à l'Unité.
Et quand vous en avez besoin ClassTwo:
Avoir la config dans ClassTwo:
MAIS ce n'est pas une bonne solution, je pense que votre problème est avec la philosophie de la DI. Vous devez cascade de dépendances à partir de la couche supérieure des classes de votre application. Résoudre la couche supérieure des classes dans une manière explicite. (
Container.Resolve
) et avec des dépendances injection en cascade vers le bas grâce à la magie de l'Unité. Lorsque 2 classes (couche supérieure ou pas) besoin d'utiliser la même instance deClassTwo
l'Unité faire le sale travail si vous avez configuréClassTwo
avecContainerControlledLifetimeManager
.En d'autres termes, vous n'avez pas besoin statique de la classe, vous injectez de la même instance d'une classe dans une autre classe que de besoin.
Merci, j'ai répliqué ce que vous avez dit et ça ne marche toujours pas. ClassTwo statique, c'était seulement parce que tous les constituants sont statiques comme ils sont liés à Excel et le Ruban d'Office par le biais de ExcelDNA et XML. J'ai enlevé le mot-clé static de la classe, enregistré ClassTwo et résolu après l'inscription ClassImplOne mais la propriété est toujours null.
L'unité ne injecter des propriétés d'une instance - vous besoin de prendre la statique au large de la déclaration de la propriété ainsi.
Désolé pour l'erreur dans le copier/coller votre code, Chris est à droite. Supprimer toutes statique déclarations dans vos classes. Je vais modifier ma réponse que le code est en contradiction avec le texte.
OriginalL'auteur jlvaquero
Édité après examen des observations:
Il existe une variété de raisons pourquoi parfois vous avez encore vouloir ou avoir besoin d'utiliser les classes statiques au lieu d'une cascade de tout, grâce à l'Unité.
Si la statique classe a une dépendance avec une autre classe que vous voulez être configurable/échangeables par l'intermédiaire de votre Unité de configuration, je préfère utiliser un modèle de fabrique, comme décrit à Comment faire pour résoudre les dépendances statiques de la classe avec l'Unité? ou tout simplement l'attribution d'une fonction pour résoudre la dépendance lorsque nécessaire, plutôt que de référencement sur le Conteneur de l'intérieur de la classe statique. Un avantage est que l'ensemble de votre Unité de configuration peuvent être dans le même lieu.
Dans votre cas, il pourrait ressembler à ceci:
Et dans votre Unité de configuration ajouter ceci:
OriginalL'auteur bgx