Créer une instance d'une classe avec des dépendances à l'aide de Autofac
Problème:
Assumer la classe:
public class MyAwesomeClass
{
private IDependCls _dependCls;
public MyAwesomeClass(IDependCls dependCls)
{
_dependCls = dependCls;
}
}
Et d'ailleurs j'ai besoin d'obtenir une instance de cette classe, comme suit:
public class SomewhereElse
{
public void AwesomeMethod()
{
//...
//AwesomeStuff
//...
var GetErDone = new MyAwesomeClass(); //PROBLEM! No constructor with 0 arguements
}
}
Question est, dois-je
Solution proposée 1:
Un) doivent prendre un supplément de constuctor qui résout la dépendance? Par exemple:
public MyAwesomeClass() //new constructor
{
_dependCls = DependencyResolver.Current.GetService<IDependCls>();
}
public class SomewhereElse
{
public void AwesomeMethod()
{
var GetErDone = new MyAwesomeClass(); //IT WORKS!!
}
}
Solution proposée 2:
B) utiliser le solveur à l'intérieur de AwesomeMethod
juste avant var GetErDone
public class SomewhereElse
{
public void AwesomeMethod()
{
var depCls = _dependCls = DependencyResolver.Current.GetService<IDependCls>();
var GetErDone = new MyAwesomeClass(depCls); //IT WORKS!!
}
}
Autofac solution?
C) Certains autres Autofac?
À la recherche pour les meilleures pratiques, ainsi qu'une bonne Autofac solution si possible. Je pense que la première manière est la pire que facultatif dépendances pourrait conduire à beaucoup de désordre.
Résumé:
Comment puis-je obtenir un new MyAwesomeClass()
quand MyAwesomeClass
a des dépendances?
Je n'ai pas de question sur constructeur de l'encombrement, plutôt que de créer une instance d'une classe qui a besoin de constructeur d'injection.
Merci de ne pas poster la solution réponse. Pas comme tout corps d'autre a ce problème... /s
OriginalL'auteur Mihalis Bagos | 2012-05-29
Vous devez vous connecter pour publier un commentaire.
Ont un look à la La Composition De La Racine modèle.
Vous êtes de droite, en tirant la résolution des dépendances ne se déplace le problème à un autre endroit. Si vous continuez à déplacer vers le haut dans votre objet graphique, cependant, vous pourrez rejoindre le point d'entrée de votre application. Il vous permettra de composer votre objet graphique.
De la comparer à la Service Localisateur anti-modèle (à l'aide de DependencyResolver dans les classes clientes dans votre cas) et vous verrez que la Composition de la Racine est une solution supérieure.
Oui, la Composition de la Racine est défini de façon abstraite en tant que "lieu", vous pouvez le diviser en plusieurs classes, mais il est important qu'ils sont contenus dans la même assemblée. Marque Seemann, l'auteur des articles, écrit un grand livre à propos de DI btw.
Avez-vous jamais obtenir une solution satisfaisante à l'aide de la Composition modèle de Racine ou autrement. Vous l'exemple de code est facile à suivre et j'aimerais voir le code pour la 3ème solution - thans
Je pense que tout le monde serait probablement d'accord que l'utilisation de DI dans le constructeur comme Seemann plus ou moins explique semble être la meilleure solution. Cependant, il ya des cas où vous pourriez avoir besoin dynamiquement pour obtenir une instance d'un contrôleur à quel point vous auriez besoin d'un constructeur sans paramètre, puis le Service Locator semble être notre seule option?
Aucun des Exemples d' + lien mort + OP jamais posté une réponse = terrible question/réponse.
OriginalL'auteur Filippo Pensalfini
Si vous voulez résoudre instance automatiquement via Autofac, vous ne pouvez choisir à partir de ce
L'injecter dans la propriété, en utilisant
var builder = new ContainerBuilder();
builder.RegisterType<Foo>().PropertiesAutowired();
Utilisation globale d'accès par
DependencyResolver.Current.GetService<IFoo>();
Qu'entendez-vous le processus de création d'une instance de cette classe ? Quelle classe souhaitez-vous pour instancier ? Et exactement ce que vous voulez faire ? Prodide plus d'informations
Veuillez voir le deuxième bloc gris. Si j'utilise le code tel quel, j'ai un problème (bien sûr). Alors, je propose 2 solutions que je n'aime pas, et demande d'un tiers ou d'une confirmation que l'un des 2 que je propose est une pratique standard. Je vais mettre à jour la réponse pour inclure mes solutions, à toi de voir
Si vous souhaitez instancier MyAwesomeClass à l'intérieur de la méthode, la meilleure façon est d'utiliser DependencyResolver. Mais, je pense que c'est une mauvaise pratique pour instancier quelque chose dans votre méthode. Vous devez créer d'interface IMyAwesomeClass et l'utilisation ctor injection dans la classe de l'utiliser. Après cela, vous pouvez utiliser le champ de la classe en vous la méthode
Oui, DependencyResolver peut être utilisé dans 2 endroits différents (les solutions que je propose). Cependant, je voudrais une solution qui ne marche pas impliquer DependencyResolver. Sur une interface, veuillez me voir commentaire sur @Pierre Lillevold réponse. Le problème reste le même, juste un niveau plus élevé. (
SomewhereElse
classe aurez BESOIN d'obtenirnew SomewhereElse()
à un certain point, de sorte que le même problème il y a)OriginalL'auteur Vitaly Zemlyansky
Dans la classe contenant
MyAwesomeMethod
prendreMyAwesomeClass
comme un constructeur de dépendance. Autofac prendra soin de l'instanciation.MyAwesomeMethod
?OriginalL'auteur Peter Lillevold
Tout d'abord en dehors de constructeur injection, vous pouvez également utiliser propriété d'injection et méthode d'injection. Cependant constructeur d'injection est le plus commun et le plus rapide, donc je suggère de s'en tenir à elle.
La deuxième chose que vous devez faire est d'enregistrer votre
MyAwesomeClass
dans l'Autofac conteneur avec sa dépendance, ils ont des belles exemples droit à leur page d'accueil.Et la dernière chose - vous ne devez pas créer des instances de
MyAwesomeClass
directement utiliser Autofac à la place. Voici une mise à jour exemple:OriginalL'auteur Sergey Rybalkin