2009-01-05 8 views
0

J'ai actuellement une bibliothèque de UserControls que j'utilise dans beaucoup de nos applications web. Je voudrais mettre à jour ces contrôles afin que je puisse utiliser IOC pour aider à séparer la logique.Puis-je créer des contrôles IOC en utilisant .NET pour les placer dans des projets web?

Je dois donc quelque chose de semblable à ce qui suit sur la page Web lui-même:

<prefix:ControlName ID="myControl" runat="server" property="value1" /> 

Et le contrôle aurait un constructeur similaire à:

public ControlName (IControlLogic logic) 

Ensuite, idéalement le récipient du CIO traiterait l'injection. Cela peut-il être fait? Si oui, quelles bibliothèques offrent cela? Si vous avez des liens que vous connaissez de discuter de cela, ils seraient très reconnaissants.

Merci à l'avance

Répondre

0

Malheureusement, il n'y a pas de réponse à cette question, de nombreux conteneurs du CIO contiennent une mise en œuvre de l'injection des propriétés de contrôle, mais il n'y a aucun moyen (actuellement) de créer effectivement un contrôle sans un constructeur sans paramètre.

1

Oui vous pouvez, je vous suggère de regarder spring.net

http://www.springframework.net/doc-latest/reference/html/springair.html

Je ne sais pas si vous voulez garder l'idée de usercontrol que vous suggérez.

Personnellement, j'utilise spring.net et nHibernate ensemble (bien que j'évite les modèles Hibernate actuellement fournis) qui fonctionnent de manière fantastique avec .net MVC beta. L'utilisation de Spring.net pour gérer nHibernate réduit légèrement les entrées de configuration, et MVC n'utilise pas les xml de contexte dont vous auriez besoin (springair est un bon exemple).

bonne chance

+0

Malheureusement, nous avons un certain nombre de contrôles utilisateur dans cette bibliothèque, donc il ne peut pas être simplement transféré vers MVC rapidement. Et injecter dans un contrôle d'utilisateur avec un constructeur ne fonctionne pas mais j'ai travaillé sur j'injecte dans les champs les informations/comportements pertinents. –

2

Unfortunatley ASP.NET ne semble pas soutenir tout motif de création d'usine facile pour les contrôles. Cependant, dans 3.5, vous disposez d'un contrôle granulaire très fin sur le code réel généré par le runtime ASP.NET pour votre fichier .aspx. Il suffit d'appliquer les attributs [ControlBuilder (...)] à tous les contrôles que vous voulez construire par votre conteneur. Sous-classe ControlBuilder et substituez ProcessGeneratedCode pour remplacer le constructeur par un appel à votre conteneur.

Voici un exemple simple:

public class ServiceProviderBuilder : ControlBuilder 
{ 
    public override void ProcessGeneratedCode(System.CodeDom.CodeCompileUnit codeCompileUnit, System.CodeDom.CodeTypeDeclaration baseType, System.CodeDom.CodeTypeDeclaration derivedType, System.CodeDom.CodeMemberMethod buildMethod, System.CodeDom.CodeMemberMethod dataBindingMethod) 
    { 
     // search for the constructor 
     foreach (CodeStatement s in buildMethod.Statements) 
     { 
      var assign = s as CodeAssignStatement; 
      if (null != assign) 
      { 
       var constructor = assign.Right as CodeObjectCreateExpression; 
       if (null != constructor) 
       { 
        // replace with custom object creation logic 
        assign.Right = new CodeSnippetExpression("("+ ControlType.FullName + ")MyContainer.Resolve<" + ControlType.BaseType.FullName + ">()"); 
        break; 
       } 
      } 
     } 
     base.ProcessGeneratedCode(codeCompileUnit, baseType, derivedType, buildMethod, dataBindingMethod); 
    } 
}  

[ControlBuilder(typeof(ServiceProviderBuilder))] 
public partial class WebUserControl1 : System.Web.UI.UserControl 
{ 
    public WebUserControl1() 
    { 

    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 
Questions connexes