3 votes

L'IoC va-t-il conduire à un trop grand nombre de paramètres pour le constructeur du contrôleur ASP.NET MVC ?

J'ai décidé d'utiliser ASP.NET MVC pour un projet de site web et souhaite suivre certaines des meilleures pratiques qui y sont décrites.

J'ai donc séparé le domaine/modèle dans un projet distinct, j'ai créé des référentiels IR et des référentiels concrets et j'ai maintenant porté mon attention sur les éléments suivants Château de Windsor en tant que IoC .

Le problème auquel je suis maintenant confronté est que pour un contrôleur particulier, dans le constructeur, je dois maintenant passer plusieurs paramètres IRepository.

Mes questions sont les suivantes :

  1. Ai-je peut-être créé trop de référentiels ? En général, j'associe 1 référentiel à 1 classe d'entité à 1 table de base de données. Mes référentiels devraient-ils contenir effectivement plus d'une entité/table de base de données ?
  2. Ai-je raté l'essentiel avec les IoC et l'injection de dépendance, et ne devrais-je pas me préoccuper de la façon dont les paramètres sont transmis dans le constructeur d'un contrôleur ?

Pour situer le contexte. Une partie du site web affichera une carte Google des propriétés qui pourra être consultée par type de propriété (château, maison, pub, etc.), emplacement (code postal, ville), heure d'ouverture etc. Ainsi, ces composants consultables sont tous des entités distinctes PropertyType, Address.City, Address.Postcode.Lat+Long, OpeningTime.DateTime. Par conséquent, il y a également 3 référentiels distincts qui doivent être passés dans le constructeur du SearchController.

Il s'agit d'un exemple simple, mais je peux envisager que de nombreux autres paramètres de référentiel soient transmis à d'autres contrôleurs à l'avenir.

J'espère que tout cela a du sens.

Merci pour toute réponse ou conseil.

3voto

bendewey Points 25437

Je ne me préoccuperais pas du nombre de paramètres que vous passez dans votre constructeur, l'IoC se chargera de toute la logique à partir de là.

Si votre contrôleur finit par avoir trop de paramètres, j'envisagerais de diviser la fonctionnalité de vos contrôleurs, ou de déplacer la logique dans une classe de service peut-être.

En ce qui concerne les référentiels, j'opte généralement pour un référentiel générique qui prend une seule entité dans son implémentation. J'ai ensuite une classe de service qui regroupe ces informations en unités logiques. Dans ce scénario, votre contrôleur n'a besoin que d'accéder au service. Par exemple :

interface IRepository<T>
{
    IQueryable<T> GetAll();
    T GetOne(int id);
    void Save(T item);
    void Delete(T item);
}

class OrderService
{
    public OrderService(IReopository<Order> orderRepository, IRepository<OrderDetail> orderDetailRepository, IRepository<Payment> paymentRepository, etc) { }

    public Order CreateOrder(List<OrderDetails> details)
    {}
    // .. other aggregate methods
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X