Posso creare controlli IOC usando .NET per essere inserito in progetti Web?
-
03-07-2019 - |
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
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