¿Puedo crear controles IOC usando .NET para colocarlos en proyectos web?
-
03-07-2019 - |
Pregunta
Actualmente tengo una biblioteca de UserControls que uso en muchas de nuestras aplicaciones web. Me gustaría actualizar estos controles para poder usar IOC para ayudar a separar la lógica.
Por lo tanto, tendría algo similar a lo siguiente en la página web:
<prefix:ControlName ID="myControl" runat="server" property="value1" />
Y el control tendría un constructor similar a:
public ControlName (IControlLogic logic)
Entonces, idealmente, el contenedor de COI manejaría la inyección. Se puede hacer esto? Si es así, ¿qué bibliotecas ofrecen esto? Si tiene algún enlace que sepa sobre esto, sería un gran agradecimiento.
Gracias de antemano
Solución 3
Desafortunadamente, no hay una respuesta única a esta pregunta, muchos contenedores IOC contienen alguna implementación de propiedades de control de inyección, pero actualmente no hay forma de crear un control sin un constructor sin parámetros.
Otros consejos
Unfortunatley ASP.NET no parece admitir ningún patrón fácil de creación de fábrica para los controles. Sin embargo, en 3.5 se le otorga un control muy preciso sobre el código real que el tiempo de ejecución de ASP.NET genera para su archivo .aspx.
Simplemente aplique los atributos [ControlBuilder (...)] a todos los controles que desee que construya su contenedor. Subclase ControlBuilder e invalide ProcessGeneratedCode para reemplazar el constructor con una llamada a su contenedor.
Aquí hay un ejemplo 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)
{
}
}
Sí puedes, te sugiero que mires spring.net
http://www.springframework.net/doc-latest /reference/html/springair.html
No estoy seguro de si desea mantener la idea de control de usuario que está sugiriendo.
Personalmente uso spring.net y nHibernate juntos (aunque evito las plantillas de Hibernate que se proporcionan actualmente), que funciona de manera fantástica con las cosas de .net MVC beta.
Usar Spring.net para manejar nHibernate reduce ligeramente las entradas de configuración, y MVC no usa el contexto xmls que necesitarías (Springair es un buen ejemplo).
la mejor de las suertes