2010-06-29 15 views
1

Ceci est mon code de liant modèle personnalisé pour la classe BaseContentObject:injection de dépendance dans ASP.NET MVC classeurs modèles personnalisés et les filtres

public class BaseContentObjectCommonPropertiesBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (controllerContext == null) 
     { 
      throw new ArgumentNullException("controllerContext"); 
     } 
     if (bindingContext == null) 
     { 
      throw new ArgumentNullException("bindingContext"); 
     } 

     BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext); 
     IContentRepository repository = new XmlContentRepository(obj.ContentType); 

     // do something with the object and repository here... 

     return obj; 
    } 
} 

J'ai laissé un peu de code pour plus de clarté.

C'est cette ligne qui m'intéresse. J'ai tout configuré pour l'injection de dépendances et fonctionne avec mes contrôleurs. J'utilise Ninject 2. D'une manière ou d'une autre, j'ai besoin de câbler DI à l'intérieur de ce classeur (et j'ai aussi un problème avec les filtres d'action MVC) - tant dans les classeurs personnalisés que dans les filtres d'action personnalisés. référentiel ou service car je dois accéder à la base de données.

Pour aggraver les choses, le référentiel de contenu n'est pas corrigé, il dépend de "obj.ContentType". Tout ce que j'ai trouvé jusqu'ici me pointe vers la documentation de Ninject mais son wiki montre seulement des exemples très basiques et, comme il semble, n'a pas encore été mis à jour vers la version 2.

+0

http://stackoverflow.com/questions/2899680/how-to-use-ninject-or-other-di-ioc-container-with-the-model-binder-in-asp-net J'ai trouvé: question et la réponse de Mark Seemann, qui parle de ne pas utiliser DI avec des classeurs, mais tout commentaire sur ce serait toujours apprécié – mare

Répondre

0

Si je comprends bien la question, vous voulez faire ce repository dans une propriété, puis, dans le constructeur, appelez Inject du noyau Ninject méthode avec this comme paramètre.

Si vous utilisez l'attribut [Inject] pour identifier les propriétés à injecter, utilisez-le sur celui-ci. Si vous utilisez la liaison automatique, créez un Module qui effectue une numérotation automatique des propriétés de type IContentRepository vers un constructeur de XmlContentRepository. Maintenant, le seul problème que vous aurez à résoudre est de passer le ContentType au Repository, étant donné que votre constructeur n'y a pas accès. Peut-être une propriété ContentType sur IContentRepository? [Edit] Tout cela dit, je ne suis pas en désaccord avec l'argument que vous devriez probablement trouver une approche différente de DI. Je ne fais qu'expliquer comment cela peut être fait, au cas où vous le voudriez vraiment.