3

je la disposition du projet suivant:Quelle est la méthode correcte pour instancier une classe IRepository à partir du contrôleur?

MVC UI 
|...CustomerController (ICustomerRepository - how do I instantiate this?) 

Data Model 
|...ICustomerRepository 

DAL (Separate Data access layer, references Data Model to get the IxRepositories) 
|...CustomerRepository (inherits ICustomerRepository) 

Quelle est la bonne façon de dire ICustomerRepository repository = new CustomerRepository(); lorsque le contrôleur n'a aucune visibilité au projet DAL? Ou est-ce que je fais cela complètement faux?

Répondre

2

Vous pouvez utiliser un conteneur IoC pour résoudre le mappage pour vous en enregistrant votre propre fabrique de contrôleurs qui permet au conteneur de résoudre les contrôleurs - le conteneur résoud le type de contrôleur et injecte une instance concrète de l'interface.

Exemple d'utilisation Castle Windsor

dans Global.asax dans votre MvcApplication classe:

protected void Application_Start() 
{ 
    RegisterRoutes(RouteTable.Routes); 
    ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory()); 
} 

WindsorControllerFactory classe

using System; 
using System.Linq; 
using System.Reflection; 
using System.Web.Mvc; 
using System.Web.Routing; 
using Castle.Core.Resource; 
using Castle.Windsor; 
using Castle.Windsor.Configuration.Interpreters; 

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    WindsorContainer container; 

    public WindsorControllerFactory() 
    { 
     container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle"))); 

     var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
           where typeof(IController).IsAssignableFrom(t) 
           select t; 

     foreach (Type t in controllerTypes) 
      container.AddComponentWithLifestyle(t.FullName, t, Castle.Core.LifestyleType.Transient); 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     // see http://stackoverflow.com/questions/1357485/asp-net-mvc2-preview-1-are-there-any-breaking-changes/1601706#1601706 
     if (controllerType == null) { return null; } 

     return (IController)container.Resolve(controllerType); 
    } 
} 
+0

Honteux admettre que je ne l'ai jamais entendu parler d'un conteneur IoC. Je n'ai jamais touché à l'injection de dépendance. Pouvez-vous me donner une explication et un exemple de la façon dont il est utilisé? – GenericTypeTea

+0

L'utilisation de Inversion of Control (IoC) facilite la construction de systèmes faiblement couplés en gérant les dépendances entre types - la plupart du temps un objet peut dépendre d'autres objets, par exemple, votre contrôleur dépend de votre référentiel pour remplir le modèle. Ces dépendances peuvent être gérées à l'aide d'un conteneur IoC tel que lorsqu'un type requiert une instance d'un autre type, il demande au conteneur de le renvoyer et le conteneur renvoie une instance du type qu'il est configuré pour renvoyer ... –

+0

Par exemple, votre Le contrôleur veut une instance concrète de 'ICustomerRepository', donc il demande au conteneur pour cela. Nous pouvons aller encore plus loin, nous pouvons faire en sorte que le conteneur gère aussi l'instanciation des contrôleurs. L'avantage que nous avons ici et l'une des nombreuses raisons d'utiliser un conteneur IoC est qu'en instanciant le contrôleur, le conteneur se rendra compte qu'il dépend de 'ICustomerRepository' et en instanciera une instance (appelée injection de dépendance) . –

Questions connexes