2010-07-19 2 views
1

Voici l'exemple de code:propriété automatiquement à la fin création d'un composant avec Autofac

public interface IService<TEntity> {   
     IContext Context { get; set; } 
     //unimportant methods 
     bool Validate(TEntity entity); 
     void Add(TEntity enttity); 
    } 

public class UsersController : Controller { 
     private IService<User> _service; 
     public MyController(IService<User> service){ 
      _service = service; 
      _service.Context = ControllerContext; 
     } 
    } 

J'utilise AutofacControllerFactory pour créer des contrôleurs dans mon application ASP.NET MVC. Est-il possible d'éliminer cette ligne de code dans le constructeur de chaque contrôleur:

_service.Context = ControllerContext; 

En d'autres termes: est-il possible de définir automatiquement cette propriété avec ControllerContext? Cela devrait être possible car chaque implémentation IService possède une propriété IContext configurable.

Dois-je étendre AutofacControllerFactory ou existe-t-il un moyen standard de le faire?

Répondre

2

Ce que vous avez là est une Dépendance circulaire.

  • UsersController dépend de IService<User>
  • IService<User> dépend de ControllerContext
  • ControllerContext dépend UsersController

No DI conteneur peut atteindre dans vos classes de contrôle et entrailles ce qui se passe là-bas. Ils peuvent mettre en place des dépendances pour vous et les injecter dans vos classes de l'extérieur. Cependant, ils ne peuvent pas très bien gérer les dépendances circulaires, donc une meilleure option est de repenser l'API. De là, il ressemble beaucoup à la propriété Contexte de IService<TEntity> est Leaky Abstraction. Un service ne devrait pas avoir besoin de savoir quoi que ce soit sur le cadre de l'interface utilisateur dans lequel il fonctionne.

Vous pouvez souvent rompre une dépendance circulaire en remplaçant l'un des consommateurs par une architecture pilotée par événement .

Voici an article about this sort of problem.

est ici une réponse liée à une question ASP.NET MVC qui ressemble beaucoup à la vôtre: Is there a good/proper way of solving the dependency injection loop problem in the ASP.NET MVC ContactsManager tutorial?

Voir aussi la réponse: Dependency-Injection to resolve circular dependencies

+0

Mark, merci pour la réponse. Dans mon cas, le service est un service de coordination de l'interface utilisateur, il est spécifique à asp.net mvc UI et devrait en savoir beaucoup à ce sujet. Mon service gère le processus de validation entre le modèle et l'interface utilisateur. – Valentin

+0

Même ainsi, vous rendre les choses beaucoup plus facile si vous pouvez vous débarrasser de la dépendance circulaire ... –

Questions connexes