Comment utiliser le Référentiel d'Interface qui utilise les Génériques avec l'Injection de Dépendance?
Je suis en essayant d'utiliser le Générique suivant le Référentiel de l'Interface pour les DI et constructeur d'injection:
public interface IRepository<TEntity> : IDisposable where TEntity : class
Le problème est dans le but de définir une instance de l'Interface, je dois fournir le type de classe comme ceci:
private IRepository<Person> _personRepository;
Le problème, c'est que si je suis à l'aide de DI (et je suis en utilisant l'Unité de Cio cadre), puis-je définir plusieurs instances dans mon constructeur pour obtenir tous référentiel des interfaces j'ai besoin de travailler avec, comme ceci:
public MyClass(IRepository<Person> personRepository,
IRepository<Orders> ordersRepository,
IRepository<Items> itemsRepository,
IRepository<Locations> locationsRepository)
{
_personRepository = personRepository;
_OrdersRepository = ordersRepository;
_itemsRepository = itemsRepository;
_locationsRepository = locationsRepository;
}
Questions:
- Est-ce OK?
- Si pas où me suis-je perdue sur ce concept?
- Même si c'est bon, ce qui est le point de l'Unité pour vous inscrire Interface de type de béton? Je l'ai déjà fait parce que le générique référentiel m'a forcé sur la déclaration.
S'il vous plaît aider éclaircir ce point pour moi, et je vous remercie tous de votre aide!
Vous devez vous connecter pour publier un commentaire.
Sûr. Il y a des préférences personnelles quant à l'utilisation du constructeur d'injection que vous avez de la ou des biens de l'injection. Constructeur d'injection est plus propre puisque vous n'avez pas à avoir beaucoup de paramètres de votre constructeur, mais il est plus sûr ainsi.
L'une des raisons en est ainsi que vous pouvez unité de test
MyClass
sans avoir à utiliser votre référentiel qui touche à une base de données. Vous pouvez "faux" le dépôt de retourner valeurs codées en dur à tester.IRepository<T> repository
que le paramètre de méthode, mais je sais que ça ne marchera pas. Pouvez-vous expliquer pourquoi ça va pas? Il se sent mal de passage tous les, mais peut-être que c'est bon et j'ai plus de pensée.Comme indiqué par D Stanley, une dépendance doit être une interface concrète. Sinon, où allez-vous déclarer T? Votre charge de la classe peut être générique, mais vous avez encore à dire "T est une Personne" à un certain point.
Cela dit, l'Unité gère l'enregistrement des types génériques très bien.
Disons que vous mettre en œuvre
IRepository<T>
avec une classe génériqueRepository<T>
qui encapsule uneDbSet<T>
(ou autre).La suite de l'enregistrement et résout ensuite le travail (qui comprend l'injection de tous les constructeurs):
Si vous avez besoin d'un spécifique de remplacer un type (dit les Éléments de référentiel est spécial pour quelque raison que ce soit, donc il a entièrement mis en œuvre
ItemRepository
classe), il suffit de s'inscrire que de mise en œuvre spécifiques après le générique:Résoudre
IRespository<Item>
maintenant obtenir votre mise en œuvre.Pour l'enregistrement, je pense que cela ne peut être fait dans le code, et non pas les fichiers de configuration. Quelqu'un n'hésitez pas à corriger cette hypothèse.
<register type="IRepository[[Item]]" mapTo="ItemRepository" />
en est un exemple. Aimez-moi un peu d'Unité.Vous pourriez envisager d'utiliser un Globale De Service que les faisceaux de plusieurs autres services, mais vous devriez aussi regarder attentivement pour voir si votre
MyClass
est essayer d'en faire trop; avoir un très grand nombre de dépendances peuvent être une indication de cela.Cela semble ok, sauf un manque point; vous avez besoin UnitOfWork modèle pour permettre les transactions.
Sans UnitOfWork motif appliqué, tous les référentiels d'essayer de commettre db opérations sur des contextes différents.
J'avais besoin de faire cela en utilisant le fichier de configuration. C'est en fait assez facile, mais m'a fallu un certain temps pour comprendre.
Dans cet exemple, nous avons une interface
IRepository<T>
et il a 2 versions:OneRepository
TwoRepository
Nous avons ensuite une classe nommée
Worker
qui dépendIRepository<One>
etIRepository<Two>
. Nous demandons à l'unité pour créer une instance deWorker
pour nous et de comprendre les dépendances à partir du fichier de configuration.De l'Interface et la mise en Œuvre
Tous ces éléments sont dans l'espace de noms
ConsoleApplication1
dans cet exemple.L'Unité De Configuration
Veuillez noter que nous demandons à l'unité et de la dire au nom de l'assemblée. Ensuite, nous enregistrons le 2 implémentations.
Application
C'est le La Composition De La Racine.
La sortie comme prévu est: