Pergunta

Actualmente tenho uma biblioteca de UserControls que eu uso em um monte de nossas aplicações web. Eu gostaria de atualizar esses controles para que eu possa usar COI a ajuda separar a lógica.

Assim, gostaria de ter algo semelhante ao seguinte na página da web em si:

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

E o controle teria um construtor semelhante a:

public ControlName (IControlLogic logic)

Em seguida, idealmente o recipiente COI iria lidar com a injeção. isso pode ser feito? Se assim o que as bibliotecas oferecem isso? Se você tiver quaisquer links que você sabe do que discutir isso, eles seriam grandes graças.

Agradecemos antecipadamente

Foi útil?

Solução 3

Infelizmente não há uma resposta a esta pergunta, muitos recipientes COI conter alguns implementação de injetar propriedades de controle, mas não há nenhuma maneira (atualmente) de realmente criar um controle sem um construtor sem parâmetros.

Outras dicas

Unfortunatley ASP.NET não parecem apoiar qualquer padrão de criação de fábrica fácil para controles. No entanto, em 3,5 você é dado controle muito fino de grão sobre o código real que o tempo de execução ASP.NET gera para seu arquivo aspx.

Basta aplicar [ControlBuilder (...)] atribui a todos os controles que você quer construídos por seu recipiente. Subclasse ControlBuilder e ProcessGeneratedCode substituição para substituir o construtor com uma chamada para o seu recipiente.

Aqui está um exemplo simples:

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

    }
}

Sim, você pode, eu sugiro que você olhar para spring.net

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

Eu não tenho certeza se você quer manter a idéia usercontrol que você está sugerindo.

Pessoalmente eu uso spring.net e nHibernate juntos (embora evitando a Modelos Hibernate actualmente assegurada) que está trabalhando fantasticamente com .NET MVC coisas beta.

Usando Spring.net para lidar com nHibernate reduz ligeiramente as entradas de configuração, e MVC não usar os xmls contexto você precisaria (springair é um bom exemplo).

melhor sorte

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top