1

Comment dois-je implémenter correctement l'accès aux données dans mes classeurs de modèle personnalisé?Quelle est la méthode appropriée pour accéder à la banque de données dans les classeurs de modèle personnalisés?

Comme dans les contrôleurs, j'utilise IContentRepository et je lui demande ensuite de créer une instance de sa classe d'implémentation dans le constructeur. J'ai donc tout prêt pour incorporer IoC (DI) à un stade ultérieur.

Maintenant, j'ai besoin de quelque chose de similaire dans le modèle de liant. J'ai besoin de faire quelques recherches DB dans le classeur. Je pense à le faire de la même manière que dans les contrôleurs mais je suis ouvert à la suggestion.

C'est un extrait d'un de mes contrôleurs afin que vous puissiez imaginer comment je le fais en eux:

 public class WidgetZoneController : BaseController 
     { 
// BaseController has IContentRepository ContentRepository field 
      public WidgetZoneController() : this(new XmlWidgetZoneRepository()) 
      { 
      } 

      public WidgetZoneController(IContentRepository repository) 
      { 
       ContentRepository = repository; 
      } 
    ... 

Répondre

0

Parce que le liant lie généralement une entité, vous n'avez pas besoin d'un référentiel spécifique comme IContentRepository, en effet IRepository<T> sera bon pour obtenir l'entité.

Pour instancier le IRipository vous pouvez utiliser quelque chose comme ça:

var repositoryType = typeof (IRepository<>).MakeGenericType(entityType); 

Je vous suggère de jeter un coup d'oeil sur la mise en œuvre CodeCampServer des entités liant, ici:

http://code.google.com/p/codecampserver/source/browse/trunk#trunk/src/UI/Binders/Entities

0

Vous pouvez utiliser l'injection de constructeur dans votre classeur de modèle personnalisé, et également hériter de DefaultModelBinder.

public class MyModelBinder : DefaultModelBinder 
{ 
    IContentRepository ContentRepository; 

    public MyModelBinder(IContentRepository contentRepository) 
    { 
     this.ContentRepository = contentRepository; 
    } 

avec des liants modèle personnalisé, vous les enregistrer dans Application_Start() comme ceci:

protected void Application_Start() 
{ 
    System.Web.Mvc.ModelBinders.Binders.Add(
      typeof(MyModel), new MyModelBinder(contentRepository) 
    ); 

Maintenant lorsque vous utilisez IoC, vous devez garder à l'esprit la durée de vie de vos objets. Lorsque vous utilisez IoC avec des contrôleurs, ils existent par requête Web. Donc, si vous injectez le Repository, les connexions de données ou les sessions OR/M n'existeront que pendant cette courte période. Avec le classeur modèle, il s'agit fondamentalement d'un Singleton à longue durée de vie (Application_Start()). Assurez-vous donc que votre référentiel fonctionne dans les deux cas.