10
votes

Injection de constructeur avec d'autres arguments du constructeur sans délai de dépendance

Je suis nouveau dans les conteneurs de la COI, et je commence à commencer avec Ninject.

Que faites-vous si vous voulez que votre constructeur ait des paramètres qui ne sont pas des services et que vous n'avez pas besoin d'être instancié par le CIO conteneur? p>

Par exemple: P>

public class Person
{
    private readonly string _name;
    private readonly IPersonRepository _repository;

    public Person(string name, IPersonRepository repository)
    {
        _name = name;
        _repository = repository;
    }

    ......
}


0 commentaires

3 Réponses :


5
votes

La classe, comme écrit ci-dessus, ne serait pas un bon candidat à utiliser avec un conteneur COI. Vous mélangez ici avec l'entité de la personne qui détient un État (le nom) et effectuer une action (quel que soit le référentiel utilisé pour). Si vous refacteur votre code de sorte que l'entité de la personne soit récupérée ou créée via une classe qui prend une implémentation de l'iPersonRepository via le constructeur, vous serez sur place où l'injection de dépendance a un meilleur sens.


0 commentaires

2
votes

I Je suis respectueusement en désaccord avec la réponse de Kevin McMahon ci-dessus, et la raison est que j'ai vu le code d'injection de dépendance qui fait exactement ce que vous voulez ... seulement avec un conteneur IOC différent. À savoir, c'était le château Windsor, qui est un autre conteneur de COI. Cela vous permettrait de créer une section dans votre fichier de configuration pour indiquer quelles valeurs pour fournir le nom (n'a pas beaucoup de sens de le faire pour le nom, mais si c'était une propriété comme "ConnectionsRing", cela pourrait faire beaucoup de sens).

Alors ... ce n'est pas que ce que vous essayez de faire n'est pas un ajustement pour une injection de dépendance en général ... c'est juste que Ninject n'apparaît pas à l'aise avec elle (ou peut-être que Ninject peut l'accueillir aussi .. . Je ne connais pas toutes ses caractéristiques moindre utilisées assez bien pour dire).


1 commentaires

En fait, je pense que Ninject peut faire ceci: par exemple: Stackoverflow.com/Questtions/1374098/... Mais avoir à transmettre les noms de paramètres comme chaînes; ne pas avoir les arguments du constructeur visibles dans IntelliSense; Nom de la méthode longue («avecConstructorarguments») ... Donnez-moi une pause!



8
votes

Cela fait plus d'un an que j'ai posé cette question et je sais plus maintenant que je ne l'ai fait à ce moment-là. La réponse de Kevin est correcte et la meilleure pratique, mais parfois, vous devez travailler avec des classes hérités et que vous voulez faire quelque chose comme si j'ai dans ma question. Voici comment je le fais avec Ninject:

public class Person
{
    [Inject]
    public IPersonRepository PersonRepository { get; set; }

    private string _name;

    public Person(string name)
    {
         _name = name;
         StaticKernelContainer.Inject(this);
    }
}


1 commentaires

Question connexe et réponse différente ici: Stackoverflow.com/questions/12136926/...