Pergunta

Eu preciso implementar o padrão clássico Factory Method em ASP.NET para criar controles de servidor dinamicamente.

A única maneira que eu encontrei para criar controles .ascx é usar o método LoadControl das classes Página / UserControl. Acho que é bagunçado no entanto vincular minha fábrica com uma página ou para passar um parâmetro de página para a fábrica.

Alguém sabe de um outro método para criar esses controles (como um método estático em algum lugar eu teria ignorado)?

Graças.

Foi útil?

Solução

No final, eu decidi passar a página como um parâmetro para a fábrica. Para fazer chamadas para o método de fábrica mais fácil, eu mudei a classe de fábrica de um singleton a uma classe comum, e eu passei a página para o construtor:

public ControlsFactory
{
    private Page _containingPage;

    public ControlsFactory(Page containingPage)
    {
        _containingPage = containingPage;
    }

    public CustomControlClass GetControl(string type)
    {
        ... snip ...
        CustomControlClass result = (CustomControlClass)_containingPage.LoadControl(controlLocation);

        return result;
    }
}

Desde que eu tenho para instanciar muitos controles em cada página com a fábrica, este é provavelmente o mais conciso e forma utilizável para implementar o padrão.

Outras dicas

Bem, após a abertura do refletor, a função LoadControl que está a ser utilizado na página está disponível em qualquer TemplateControl.

Dentro do LoadControl real usa métodos internos no BuildManager, então eu não acho que há uma maneira de usar métodos estáticos sem o uso de reflexão.

Bem, pelo menos você não precisa para passar uma página ao redor. Subclassificação TemplateControl iria funcionar.

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