Puis-je créer des contrôles IOC en utilisant .NET pour être placés dans des projets Web?

StackOverflow https://stackoverflow.com/questions/412859

Question

Je dispose actuellement d'une bibliothèque de contrôles utilisateur que j'utilise dans bon nombre de nos applications Web. Je souhaite mettre à jour ces commandes pour pouvoir utiliser IOC afin de séparer la logique.

J'aurais donc quelque chose de similaire au suivant sur la page Web elle-même:

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

Et le contrôle aurait un constructeur similaire à:

public ControlName (IControlLogic logic)

Alors, idéalement, le conteneur IOC gérerait l’injection. Cela peut-il être fait? Si oui, quelles bibliothèques offrent cela? Si vous avez des liens dont vous avez connaissance qui en discuteraient, ils seraient très reconnaissants.

Merci d'avance

Était-ce utile?

La solution 3

Malheureusement, il n’existe pas de réponse unique à cette question. De nombreux conteneurs IOC contiennent des implémentations de propriétés de contrôle par injection, mais il n’existe aucun moyen (actuellement) de créer un contrôle sans constructeur sans paramètre.

Autres conseils

Unfortunatley ASP.NET ne semble prendre en charge aucun modèle de création d’usine facile pour les contrôles. Toutefois, dans la version 3.5, vous disposez d’un contrôle très précis sur le code réel généré par le runtime ASP.NET pour votre fichier .aspx.

Appliquez simplement les attributs [ControlBuilder (...)] à tous les contrôles que vous souhaitez créer avec 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)
    {

    }
}

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 souhaitez conserver l'idée de contrôle utilisateur que vous suggérez.

Personnellement, j'utilise spring.net et nHibernate ensemble (en évitant toutefois les modèles Hibernate actuellement fournis), qui fonctionne à merveille avec les éléments .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 le xml de contexte dont vous auriez besoin (springair est un bon exemple).

bonne chance

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top