Puis-je créer des contrôles IOC en utilisant .NET pour être placés dans des projets Web?
-
03-07-2019 - |
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
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