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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top