Kann ich IOC Kontrollen unter Verwendung von .NET erstellen in Webprojekte platziert werden?

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

Frage

Im Moment habe ich eine Bibliothek von Benutzersteuerelementen, die ich in vielen unseren Web-Anwendungen verwenden. Ich mag diese Kontrollen aktualisieren, damit ich IOC verwenden kann, um die Logik zu trennen.

So würde ich etwas ähnliches wie die folgenden auf der Web-Seite selbst:

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

Und die Steuerung würde einen Konstruktor ähnlich müssen:

public ControlName (IControlLogic logic)

Dann idealerweise die IOC-Container würden die Injektion behandeln. Kann dies geschehen? Wenn ja, welche Bibliotheken bieten? Wenn Sie alle Links, die Sie davon wissen, besprechen Sie dies würden sie großen Dank sein.

Vielen Dank im Voraus

War es hilfreich?

Lösung 3

Leider gibt es keine eine Antwort auf diese Frage, enthalten viele IOC-Container eine Implementierung von Steuerungseigenschaften Injektion, aber es gibt keine Möglichkeit, (derzeit) tatsächlich eine Kontrolle ohne parameterlosen Konstruktor zu schaffen.

Andere Tipps

Unfortunatley ASP.NET scheint keine einfache Fabrik Schaffung Muster für Kontrollen zu unterstützen. in 3,5 Sie sind jedoch gegeben sehr feinkörnige Kontrolle über den eigentlichen Code, der die ASP.NET-Laufzeit für Ihre ASPX-Datei erzeugt.

Einfach anzuwenden [Control (...)] Attribute für alle Steuerelemente, die Sie von Ihrem Behälter aufgebaut werden soll. Subklassen-Control und außer Kraft setzen ProcessGeneratedCode den Konstruktor mit einem Aufruf an Ihren Container zu ersetzen.

Hier ist ein einfaches Beispiel:

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)
    {

    }
}

Ja, Sie können, würde ich vorschlagen, Sie sehen spring.net

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

Ich bin nicht sicher, ob Sie die Usercontrol Idee halten möchten, die Sie vorschlagen.

Ich persönlich verwende spring.net und nHibernate zusammen (obwohl die Hibernate Templates zur Zeit zur Verfügung gestellt zu vermeiden), die fantastisch mit .net MVC Beta Zeug funktioniert.

Spring.net Mit handhaben nHibernate leicht reduziert die Konfigurationseinträge und MVC verwendet nicht den Kontext XMLs würden Sie müssen (springair ist ein gutes Beispiel).

viel Glück

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top