2010-01-04 3 views
3

Est-il possible d'injecter des dépendances dans un contrôle CMS immédiat à l'aide de Spring.NET, idéalement sans avoir à utiliser ContextRegistry lors de l'initialisation du contrôle?Spring.NET & Immediacy CMS

Répondre

0

Je vais répondre à celui-ci avec une solution que j'ai utilisée pendant plus d'un an avec Immediacy 6.x. En théorie, cela devrait fonctionner avec Alterian CMC 7.x (le successeur d'Immédiat) avec quelques modifications.

Le problème ici est que Immediacy a déjà un gestionnaire défini dans web.config qui gère toutes les pages aspx. Cependant, j'ai trouvé cela peut être remplacé par une entrée pour PageHandlerFactory de Spring.NET dans web.config, comme dans la plupart des applications webforms! Cependant, certains ajustements sont toujours nécessaires car, en sortie de boîte, il y a toujours des problèmes avec le visualiseur. Le processus pour obtenir Spring.NET jouer bien avec un contrôle Instantanéité est:

  1. Ajoutez les entrées habituelles à web.config pour Spring.NET as outlined in the documentation. Dans ce cas, j'ai mes définitions d'objets dans Spring.config.

  2. Créer la classe de base abstraite suivante qui traitera de tous les travaux d'injection Dépendance:

    SpringImmediacyControl.cs

    public abstract class SpringImmediacyControl : ImmediacyControl, ISupportsWebDependencyInjection 
    { 
        // You can do the same thing for other control classes, like LiteralControl 
    
        #region ISupportsWebDependencyInjection Members 
    
        public IApplicationContext DefaultApplicationContext 
        { 
         get; 
         set; 
        } 
    
        #endregion 
    
        protected override void OnInit(EventArgs e) 
        { 
         // Required for page preview, which is executed using Immediacy's page preview handler 
    
         if (DefaultApplicationContext == null) 
         { 
          DefaultApplicationContext = ContextRegistry.GetContext() as WebApplicationContext; 
          DefaultApplicationContext.ConfigureObject(this, this.GetType().FullName); 
         } 
    
         base.OnInit(e); 
        } 
    
        protected override void AddedControl(Control control, int index) 
        { 
         this.EnableViewState = false; 
    
         // Handle DI for children ourselves - defaults to a call to InjectDependenciesRecursive 
    
         if (DefaultApplicationContext != null) 
          WebDependencyInjectionUtils.InjectDependenciesRecursive(DefaultApplicationContext, control); 
    
         base.AddedControl(control, index); 
        } 
    } 
    

    Ceci est similaire à the code for server side controls over on the Spring.NET documentation.Cependant, le code de contrôle nul supplémentaire OnInit & est nécessaire parce que l'outil de prévisualisation rend le contrôle sous le gestionnaire HTTP d'Immediacy. Cela signifie qu'un appel manuel au registre de contexte de Spring.NET est nécessaire pour injecter des dépendances.

  3. Pour toute commande avec laquelle vous souhaitez utiliser avec l'inversion de Spring.NET du conteneur de contrôle, ajoutez l'entrée relelvant à Spring.config, par exemple:

    SampleControl.cs

    public class SampleControl : SpringImmediacyControl, INamingContainer 
    { 
        public string Text 
        { 
         get; 
         set; 
        } 
    
        protected string InjectedText 
        { 
         get; 
         set; 
        } 
    
        public SampleControl() 
         : base() 
        { 
         Text = "Hello world"; 
        } 
    
        protected override void RenderContents(HtmlTextWriter output) 
        { 
         output.Write(string.Format("{0} {1}", Text, InjectedText)); 
        } 
    } 
    

    Spring.config

    <objects xmlns="http://www.springframework.net"> 
        <object type="MyProject.SampleControl, MyAssembly" abstract="true"> 
         <property name="InjectedText" value="from Spring.NET" /> 
        </object> 
    </objects> 
    
  4. Pourvu que tout soit fait correctement, vous aurez le contrôle écrit "Bonjour tout le monde de Spring.NET!" lorsqu'il est utilisé dans une page.

All of the code I've used can be downloaded & forked from here.

En aparté, le processus est similaire si vous souhaitez créer des sous-classes compatibles Spring.Net de ButtonPluginConfig, à l'exception de ces sous-classes sont toujours exécutés sous sa propre gestionnaire HTTP Instantanéité pour la configuration de contrôle, & donc l'appel du registre de contexte de Spring.NET est toujours requis. J'ai également inclus une classe abstraite dérivée de ButtonPluginConfig dans l'essentiel ci-dessus.

1

En tant qu'ancien employé d'Immédiatement, j'avais l'habitude de voir ce genre de problème tout le temps. Pensez à l'instantané comme étant une application Web standard .net qui se trouve au-dessus du cadre. Ils ont simplement étendu les classes de base pour des choses comme la classe Page et ajouté des objets utiles dans le monde entier.

L'immédiateté possède ses propres classes de base pour les contrôles ect mais rien ne vous empêche de créer vos propres contrôles basés sur les classes .net standard. Un truc que j'ai vu où vous devez faire quelque chose de spécifique qui peut casser une fonction d'immédiateté est de créer une application enfant puis d'appeler des pages à partir de celui-ci dans un contrôle personnalisé que vous ajoutez à l'application principale.

De cette façon, votre application enfant peut faire ce qu'elle veut sans rien casser et l'application parent immédiate et lit simplement un flux de cette application.

dans sa forme la plus simple astuce consiste à créer simplement un contrôle qui fait une chose ...

WebClient wc = new WebClient(); 
this.Controls.Add(Page.ParseControl(wc.DownloadString("/childapp/yourcustomthing.aspx"))); 

La propre autre façon de le faire est de mettre en œuvre le composant enfant requis comme un gestionnaire de ashx de ce j'ai vu. Le seul problème que vous pouvez soulever est que vous perdez le cadre immédiat des objets dans votre application enfant, mais vous pouvez facilement transmettre des informations clés via querystrings puis créer votre propre "cache de dépendance" contenant les éléments dont vous avez besoin .

Ce n'est pas un idéal que je connais, mais l'immédiateté a l'habitude de rendre la vie difficile lorsque vous devez faire quoi que ce soit au-delà de tomber dans des listes ou des modèles similaires.

+0

Merci pour la réponse - c'est toujours très intéressant d'avoir un aperçu d'un ancien employé d'Immédiat. L'approche de l'application enfant est exactement ce que je ferais si je n'arrivais pas à faire fonctionner Spring.NET avec Immediacy, qu'il s'agisse d'une application MVC ou d'aspx gérées par Spring.NET. J'ai déjà commencé à travailler sur l'intégration de Spring.NET dans une application Immediacy et l'approche que j'ai décrite fonctionne, même avec NHibernate & OpenSessionInView - cela ne casse pas Immediacy! En aparté, nous faisons même des modèles de contrôle en utilisant Spark et en mettant des choses non immédiates sur ASP.NET MVC - des choses intéressantes! –

+0

Semble intéressant, j'aurais probablement pu fournir une solution similaire à celle que vous avez trouvé vous-même, mais n'étant pas à la hauteur avec Spring.Net je ne voulais pas donner le mauvais conseil. L'immédiateté est généralement assez flexible, une autre idée aurait pu être de mettre dans votre propre gestionnaire et dans cet appel l'immédiateté ainsi que la gestion de votre propre code ... aurait pu être tout à fait lourd de code cependant. Ça devient de plus en plus comme un point de partage ... si grand que les gens ont peur d'en approcher, c'est un changement rafraîchissant de voir des gens assumer une telle tâche. – War