Domanda

Al momento ho una libreria di UserControls che utilizzo in molte delle nostre applicazioni web. Vorrei aggiornare questi controlli in modo da poter usare il CIO per aiutare a separare la logica.

Quindi avrei qualcosa di simile al seguente sulla stessa pagina web:

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

E il controllo avrebbe un costruttore simile a:

public ControlName (IControlLogic logic)

Quindi idealmente il contenitore IOC dovrebbe gestire l'iniezione. Può essere fatto? In tal caso, quali biblioteche offrono questo? Se hai dei link di cui sei a conoscenza di questo argomento, sarebbero di grande ringraziamento.

Grazie in anticipo

È stato utile?

Soluzione 3

Sfortunatamente non esiste una risposta a questa domanda, molti contenitori IOC contengono alcune implementazioni delle proprietà di controllo dell'iniezione, ma non esiste (attualmente) un modo per creare effettivamente un controllo senza un costruttore senza parametri.

Altri suggerimenti

Purtroppo ASP.NET non sembra supportare alcun modello di creazione di fabbrica semplice per i controlli. Tuttavia, in 3.5 ti viene dato un controllo molto fine sul codice effettivo che il runtime ASP.NET genera per il tuo file aspx.

È sufficiente applicare gli attributi [ControlBuilder (...)] a tutti i controlli che si desidera vengano creati dal proprio contenitore. Sottoclasse ControlBuilder e sostituzione ProcessGeneratedCode per sostituire il costruttore con una chiamata al proprio contenitore.

Ecco un semplice esempio:

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

    }
}

Sì, puoi suggerire di dare un'occhiata a spring.net

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

Non sono sicuro che tu voglia mantenere l'idea di controllo degli utenti che stai suggerendo.

Personalmente uso spring.net e nHibernate insieme (anche se evito i modelli di ibernazione attualmente forniti) che funziona in modo fantastico con roba beta .Cl MVC.

L'uso di Spring.net per gestire nHibernate riduce leggermente le voci di configurazione e MVC non usa il contesto xmls di cui avresti bisogno (springair è un buon esempio).

buona fortuna

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top