2010-01-21 8 views
2

Je ne cherche pas de code directement, mais pour quelques idées comment résoudre mon problème le mieux.Asp.net MVC - Comment réaliser des modules flexibles à utiliser cross-projet?

Il y a cette application mvc asp.net sur laquelle je travaille. Il devrait être «hautement modulaire» et de nombreuses parties doivent être réutilisées dans différents projets.

Notre approche actuelle utilise le cadre d'extensibilité géré pour importer des assemblages lors de l'exécution. Ceux-ci consistent généralement en tout ce qui est nécessaire pour travailler; modèles, vues et contrôleurs. Les routes et les boutons de navigation/menu principal sont enregistrés lors de l'importation. Cela fonctionne jusqu'à présent; Par exemple, je peux simplement copier l'assemblage "news-column" dans n'importe quel autre projet, inclure les choses MEF, et "magiquement" le nouveau projet sert une fonctionnalité de news accessible sur/News/List. Toutefois, le problème est que, dans la plupart des cas, la vue par défaut livrée dans l'assemblage convient, mais j'aimerais parfois que le contrôleur importé apparaisse avec une vue différente, affichant d'autres champs dans une disposition personnalisée. Mon approche actuelle consiste à rendre les méthodes d'action dans les modules virtuelles. Si un autre projet doit rendre la liste avec une vue personnalisée, je substitue simplement la méthode list, appelle la méthode de base pour remplir ViewData, puis appelle simplement la vue que je veux. Cependant, cela semble quelque peu sale et si quelqu'un connaît une meilleure solution, je l'apprécierais vraiment.

Un autre problème que je suis confronté est que je peux vouloir qu'un modèle importé fonctionne avec une table différente. Nous allons avec Fluent NHibernate où la table cible est définie dans ClassMap - Table ("News"). Mappages sont importés comme ceci:

foreach(Assembly assembly in assemblies) 
    configuration.Mappings(m => m.FluentMappings.AddFromAssembly(assembly)); 

Je ne pouvais pas comprendre comment changer la table d'une cartographie importée, mais je crois qu'il ya un moyen simple?

Merci pour au moins lire ce :)

+0

Petit nitpick: MEF est l'abréviation de Managed Extensibility Framework, pas de Microsoft Extensibility Framework –

+0

Absolument correct, désolé, je fais cette erreur tout le temps – Steffen

Répondre

0

Je ne pense pas que vos actions impérieuses de contrôleur devrait se sentir « sale ». En fait, j'utilise des actions de contrôleur de base dans une bibliothèque commune pour des choses qui peuvent être facilement extraites comme l'authentification de l'utilisateur. D'un autre côté, l'authentification est généralement très spécifique à l'interface utilisateur, donc je ne me soucie pas vraiment de créer des vues réutilisables.

Je crée aussi des classes de contrôleur de base au sein de mes applications pour gérer la création/la disposition de mon contexte EF, etc.

Vous pouvez envisager votre abstraire l'accès aux données. Même si vous utilisez NHibernate et que votre implémentation standard utilise un certain schéma DB, vous rencontrez un problème assez classique de réutilisation de code: mettre trop de logique spécifique dans votre paquet réutilisable. En règle générale, j'essaie de garder les spécificités de base de données hors de mon code réutilisable. J'utilise des objets et des interfaces POCO d'utilisation pour pouvoir utiliser n'importe quel type de source de données pour créer mes objets. Je peux alors avoir un autre assemblage avec une implémentation standard utilisant SQL Server, EF, mon schéma de base de données préféré, etc. Cependant, dans le cas où je devrais le connecter à autre chose, j'implémente simplement une ou plusieurs interfaces dans une nouvelle version.

Hope qui répond à votre question.