2010-04-08 7 views
0

Si vous pouvez enregistrer vos contrôleurs dans votre implémentation IoC, pourquoi ne pouvez-vous pas également créer vos ModelViews à partir de votre conteneur IoC?MVC 2, IoC, ModelView et Binding

Je suis actuellement à l'aide Autofac 1.4 pour injection IoC pour les contrôleurs avec les éléments suivants:

ControllerBuilder.Current.SetControllerFactory((IControllerFactory) new AutofacControllerFactory(ContainerProvider)); 

Je ne vois pas une façon de dire MVC d'utiliser le conteneur comme usine d'objet pour mes ViewModels cependant, Ai-je manqué quelque part?

+3

Pourquoi voulez-vous le conteneur du CIO pour créer les ViewModels? – uvita

+0

Mes ViewModels sont une abstraction fine de la page Html résultante et sont composés de services de domaine et d'objets. Si j'ai une méthode de postback de contrôleur "public My ActionMesid MyMethod (MyDomainObject myDomainObject)" et le constructeur pour MyDomainObject a des dépendances qui peuvent être résolues avec le conteneur IoC. Je ne vois tout simplement pas pourquoi le classeur modèle nécessiterait un constructeur par défaut lorsque les contrôleurs peuvent être injectés par le constructeur. Il existe une méthode MVC "ControllerBuilder.Current.SetControllerFactory" Je pense qu'il devrait y avoir un "ControllerBuilder.Current.SetModelFactory". – Mike

Répondre

1

Étant donné que votre contrôleur est susceptible d'avoir plusieurs vues, chacune avec son propre ViewModel, vous ne les créez normalement pas via l'injection de contstructor.

Vous pouvez donc enregistrer vos ViewModels avec votre IoC mais cela signifierait de fournir un localisateur de service dans votre contrôleur afin d'obtenir une instance d'un ViewModel.

builder.Register<MyViewModel>().As<IMyViewModel>().FactoryScoped(); 

et dans votre contrôleur

var MyViewModel = ContainerProvider.RequestContainer.Resolve<IMyViewModel>(); 

ce n'est pas la façon typique de la gestion ViewModels pour vos contrôleurs sauf si vous voulez les rendre dynamiques en quelque sorte.

Dans la plupart des cas, vous créez une instance de votre ViewModel dans vos méthodes de régulation

public ActionResult Details() 
{ 
    var model = new MyViewModel(); 

    return View (model); 
} 
+0

Merci de votre réponse. Voir mon commentaire ci-dessus pour une réponse un peu plus détaillée. L'essentiel de cela est lors de la publication d'une méthode de contrôleur, le ModelBinders crée une instance de vos objets puis les remplit avec les valeurs des données de publication. Pourquoi MVC n'a-t-il pas la capacité de construire les viewModels de la même manière que le contrôleur depuis une usine fournie par le conteneur IoC? – Mike

+3

@Mike vous pouvez toujours créer un ModelBinder personnalisé qui utilise IoC pour obtenir une instance de votre ViewModel. –