2010-03-12 5 views
2

Je souhaite améliorer ma page en combinant et en réduisant les fichiers javascript et CSS. Puisque MVCContrib contient déjà un projet appelé IncludeHandling, j'ai jeté un oeil à ce qui malheureusement m'a laissé avec des questions sans réponse:Gestion des inclusions dans MVC 2/MVCContrib

Il y a tout un ensemble d'interfaces et d'objets impliqués dans le processus. Maintenant, j'utilise Ninject.Mvc, mais il semble que MvcContrib.IncludeHandling utilise un peu supplémentaire (home-brassé?) DI? Puis-je travailler autour de ça? Est-ce que quelqu'un a utilisé ceci et peut partager quelques expériences? Deuxièmement, le conseil souvent entendu est de mettre du contenu statique sur différents domaines afin que la demande ne contienne pas de cookies et autres, ce qui facilite beaucoup la gestion de la requête par le serveur. Mais comment puis-je combiner cela avec la gestion automatique des inclusions - n'est-ce pas nécessairement servi dans la même application?

EDIT: Figured qu'il n'y a vraiment qu'un seul appel dans la résolution tout, je me demande vraiment pourquoi ils utilisent DI pour cela ... En pensant à une fourchette ... il

+0

Comment avez-vous résoudre ce problème? Je rencontre le même problème. –

+0

Compris après avoir téléchargé la source. Tu as raison, c'est un peu ridicule. Cela ne devrait pas nécessiter un cadre DI. Quel paraisseux. –

+1

Je ne suis pas trop content de MvcContrib en général - en fait, la suppression de la dépendance est sur ma liste de choses à faire pour la semaine prochaine ... J'espčre actuellement le type de solution '.csjs' qui pourrait venir avec le rasoir voir le moteur et mvc3, sinon je vais rouler le mien, je suppose. – mnemosyn

Répondre

2

Eh bien, MvcContrib.IncludeHandling utilise DependencyResolver de MvcContrib pour trouver les composants nécessaires. Ce n'est pas très bien documenté (voir l'exemple de site pour plus de détails, bien que dans ce cas utilise un injecteur personnalisé).

Par exemple, MvcContrib.Castle a un WindsorDependencyResolver pour ce conteneur IoC que vous pouvez imiter pour utiliser NInject (il peut y avoir quelque chose si vous avez Google autour). L'initialisation est assez bavard, mais va comme ceci (conteneur est le conteneur de Windsor, dans votre cas, utilisez ninject):

var httpContextProvider = new HttpContextProvider(HttpContext.Current); 
var settings = IIncludeHandlingSettings)ConfigurationManager.GetSection("includeHandling"); 

container.Register(Component.For(typeof(IIncludeReader)).ImplementedBy(typeof(FileSystemIncludeReader)));    

container.Register(Component.For(typeof(IIncludeStorage)).ImplementedBy(typeof(StaticIncludeStorage)));   
container.Register(Component.For(typeof(IKeyGenerator)).ImplementedBy(typeof(KeyGenerator))); 
container.Register(Component.For(typeof(IIncludeHandlingSettings)).Instance(settings)); 
container.Register(Component.For(typeof(IHttpContextProvider)).Instance(httpContextProvider)); 
container.Register(Component.For(typeof(IIncludeCombiner)).ImplementedBy(typeof(IncludeCombiner))); 
container.Register(Component.For(typeof(IncludeController)).ImplementedBy(typeof(IncludeController)).LifeStyle.Transient); 

DependencyResolver.InitializeWith(new WindsorDependencyResolver(Container)); 

De cette façon, vous pouvez enregistrer toutes les dépendances nécessaires. Méfiez-vous que vous avez besoin de la section includeHandler dans votre configuration web.

<configSections> 
    <section name="includeHandling" type="MvcContrib.IncludeHandling.Configuration.IncludeHandlingSectionHandler, MvcContrib.IncludeHandling"/> 
</configSections> 
<includeHandling> 
</includeHandling> 

J'espère que cela a aidé.

0

Voici une version Unity de l'installation DependencyResolver. Je l'ai fait comme une extension de conteneur Unity.

public class ConfigureMvcContrib : UnityContainerExtension 
{ 
    protected override void Initialize() 
    { 
     var settings = (IIncludeHandlingSettings)ConfigurationManager.GetSection("includeHandling"); 

     Container 
      .RegisterFactory<IHttpContextProvider>(c => new HttpContextProvider(HttpContext.Current)) 
      .RegisterFactory<IIncludeReader>(c => new FileSystemIncludeReader(c.Resolve<IHttpContextProvider>())) 
      .RegisterType<IIncludeStorage, StaticIncludeStorage>() 
      .RegisterType<IKeyGenerator, KeyGenerator>() 
      .RegisterFactory<IIncludeCombiner, IncludeCombiner>() 
      .RegisterInstance<IIncludeHandlingSettings>(settings); 

     DependencyResolver.InitializeWith(new UnityDependencyResolver(Container)); 
    } 
} 

Il convient de noter que la configuration IncludeHandling n'est pas idéal pour une configuration de cluster Web, comme à cause de la façon dont il fait la mise en cache. J'ai dû lancer ma propre action de contrôleur qui a pris une liste de fichiers à combiner et à réduire. Je peux fournir plus d'informations si quelqu'un est intéressé.

Questions connexes