2010-01-01 4 views
1

J'ai récemment suivi Stephen Walther en créant un référentiel générique pour vos modèles de données en utilisant Entity Framework avec le lien suivant, http://bit.ly/7BoMjTControllerFactory: Entity Framework

Dans ce blog il parle brièvement de la création d'un référentiel générique et pourquoi il est suggéré pour ce faire (pour éviter les frictions). Le blog lui-même ne va pas dans les moindres détails sur la façon d'injecter le GenericRepository dans votre projet pour lequel vous aurez besoin de télécharger son code source de code commun. Cependant, une fois que j'ai finalement compris l'importance du modèle Repository, et comment cela fait une différence dans les modèles de données que je crée dans ASP.Net MVC, je me demandais si je pouvais faire quelque chose de similaire à mes contrôleurs et vues? Puis-je créer un ControllerRepository ou une ControllerFactory (comme je l'ai fait pour Bing) et créer un contrôleur générique avec 5 ActionResults et en fonction de ce que j'injecte dans mon Datamodel GenericRepository (ie j'ai DellXPSComputers, GateWayComputers, HPComputers en tant que single db datamodel)

Et en fait, il n'y a qu'un contrôleur en plus du Generic que je crée qui ira chercher le bon datamodel et afficher?

Si oui, quelle est la meilleure façon de l'implémenter?

Répondre

0

Vous pouvez créer une usine de contrôleur générique, mais je ne vois pas beaucoup de scénarios pourquoi vous voudriez jamais. Sauf dans vos tests et vos redirections, vous n'appelez jamais une méthode de contrôleur directement (par rapport à une méthode de référentiel que vous appelez dans de nombreux endroits).

0

Oui! Vous pouvez absolument!

Je l'ai fait dans le passé avec beaucoup de succès. Le résultat est que vous vous retrouvez avec une couche d'application web faisant surface vos dépôts avec presque aucun code (juste ce qui est nécessaire pour fournir des services CRUD pour vos entités).

En fin de compte, vous finirez avec quelque chose comme ceci dans votre implémentation de CreateController:

Type controllerType = controllerbase.MakeGenericType(entityType, datacontextType); 
var controller = Activator.CreateInstance(controllerType) as IController; 
return controller; 

les hommes plus sages que moi utiliseraient un cadre du CIO pour injecter les types, j'utilise la réflexion ancienne plaine et lire les noms de type sur des valeurs d'itinéraire dans les URL comme:

http://computer/repo/entityname/by/fieldname/value.html

Bonne chance!