2009-01-11 7 views
1

J'essaie d'intégrer Autofac dans une application Web ASP.NET existante.Utilisation d'Autofac avec ASP.NET et le modèle MVP

Les pages suivent le modèle MVP. Chaque page implémente une fonctionnalité Afficher et déléguer à un présentateur. La vue est injectée dans le Presenter via le constructeur.

J'ai pu enregistrer le Presenter et View et la page se charge bien, mais quand une publication se produit, les contrôles utilisateur sur la vue sont NULL. Il semble qu'Autofac crée une nouvelle instance de la Page à donner au présentateur au lieu de lui donner l'instance réelle de l'instance. Existe-t-il un moyen d'enregistrer des instances de page avec Autofac?

Est-ce que quelqu'un utilise Autofac avec ASP.NET et MVP?

Merci!

Répondre

0

J'ai trouvé une solution. Fondamentalement, vous devez enregistrer l'instance de la page au cours de l'événement Page_PreInit, puis appeler le conteneur pour injecter les dépendances. Ex. Je ne suis pas sûr s'il y a un meilleur moyen, mais cela semble fonctionner.

2

Il existe un meilleur moyen. D'abord, activez the Web integration module. Cela activera l'injection de propriété automatique dans l'instance Page.

Étant donné que votre présentateur a besoin de la vue dans son constructeur, votre page doit être dépendante d'un présentateur usine au lieu du présentateur lui-même.

Donc, vous devez d'abord l'usine de présentateur, qui est un délégué avec les paramètres nécessaires:

public delegate IOCTestPresenter IOCTestPresenterFactory(IIOCTestView view); 

Ce délégué doit correspondre aux paramètres (type et le nom) du constructeur du présentateur:

public class IOCTestPresenter 
{ 
    public IOCTestPresenter(IIOCTestView view) 
    { 
    } 
} 

à votre avis, ajouter un logement recevant le délégué de l'usine, et utiliser le délégué pour créer le présentateur:

public partial class IOCTest 
{ 
    public IOCTestPresenterFactory PresenterFactory {get;set;} 

    protected void Page_Load(object sender, EventArgs e)  
    { 
      var presenter = PresenterFactory(this); 
    } 
} 

Dans votre configuration de conteneur, vous devrez effectuer les enregistrements suivants:

builder.Register<IOCTestPresenter>().FactoryScoped(); 
builder.RegisterGeneratedFactory<IOCTestPresenterFactory>(); 
Questions connexes