Compilando / Incorporação Controles template ASCX de usuários para reutilização em múltiplas aplicações web

StackOverflow https://stackoverflow.com/questions/1006086

Pergunta

Eu estou em um verdadeiro cabeça scratcher aqui ... e que parece ser um dos temas mais frustrantes do ASP.NET.

Eu tenho um conjunto que implementa a-lot do costume Linq coisas, que para ele do núcleo tem funcionalidade web zero. I tem um conjunto adicional que se estende esta montagem com comportamento específico da web.

O comportamento específico web vem com um par de controles de usuário marcados por dentro ASCX templated UserControls.

Estou tendo problemas para colocar um acabamento agradável neste montagem de modo que é simples de implementar novamente para uso em outras aplicações. Deixa-me correr através do que eu tentei até agora:

  1. copiou os arquivos ASCX para a aplicação web consumindo usando eventos de compilação; longe do ideal e bastante um pesadelo implantação .
    • Implementado um costume VirtualPathProvider e incorporados os modelos ASCX dentro do conjunto como recursos incorporados. Infelizmente quando usando a diretiva Register na aplicação de consumi-la cria a declaração designer como um UserControl, onde eu iria exigir uma declaração do tipo controle real; imprevisto (tipicamente) e indesejável .
    • criou um projeto de implantação da Web para compilar os UserControls, mas os controles de usuário compilados em seguida, tornar-se parte de uma outra montagem, e já não descem das definições de classe em minha web montagem - a montagem precisa instanciar-los dependentes o contexto de solicitação .

Assim, o número 1 é apenas uma porcaria, número 2 não me dá o suporte Tipo de desejo e número 3 eu acho que eu estou a ponto de produzir uma solução razoável com:

  • protuberância todas as classes não-controlo para a pasta App_Code, preparar uma classe de fábrica que vai construir um objecto do tipo de controle desejado usando a reflexão e a expectativa de que o tipo a ser reflectida vai estar presente na saída de implantação (espera-se garantida pela presença do atributo ClassName na directiva Control).

Há também sempre a outra opção de reescrever os controles ASCX em controles personalizados, mas simplesmente não têm os recursos para considerá-lo no momento, e nós não temos experiência em fazer isso, e eles trabalham muito bem como UserControls .

Am I faltando alguma coisa óbvia, algo talvez muito mais simples, ou é apenas propositadamente difícil? Eu li histórias do processo de compilação ASP.NET sendo muito infeliz em seu design em minhas viagens em todo este tema.

Foi útil?

Solução

Bem, eu acho que fiz isso ... por estar consciente de alguns de algumas armadilhas irritantes com a minha última abordagem, eu recomendo o seguinte quando compilar controles de usuário ASCX em um projeto de aplicativo Web usando um projeto de implantação da Web:

  1. Evite colocar as classes em App_Code a menos que sejam independentes ou auxiliares aulas, ASP.NET trata isso como um speshul pasta, o significado do que é perdido em mim, caos, confusão e caos segue. Código nesta pasta faz obter uma saída no Projeto de Implantação da Web, no entanto.
    • Preste atenção aos seus nomes de montagem, seus namespaces raiz e saída de implantação de montagem Nome você poderá obter erros access is denied se você tem qualquer conflito de nomeação durante o processo de aspnet_merge.
    • Em última análise, você provavelmente vai acabar implantação de 2 assembléias, eu tentei criar apenas um, mas a saída de implantação ainda estava apontando para digitar definições na fonte de montagem. Este não é um problema se você não tem quaisquer outros tipos em seu projeto de aplicativo Web - Tenho por isso foi um problema para mim. No meu caso, a minha saída final foi:
    • <Organisation>.<TechnologyName>.Web.DLL - Compilado de Montagem de Aplicativos Web (contendo os modelos ASCX)
    • <Organisation>.<TechnologyName>.Web.UI.DLL - ASP.NET Compilado UserControl montagem, criado pelo Projeto de Implantação da Web
    • Limpe frequentemente, e verificação de que os caminhos bin e obj do projeto de aplicativo web são eliminados de qualquer junk anterior construído quando você talvez não tinha finalizado o seu namespace ou esquema de montagem nomeando - o projeto de implantação da Web será bastante ansiosos para incluir estes , causando uma bela confusão.
    • Verifique se o seu namespaces importados, o compilador ASP.NET gosta de se referir a directiva Import no modelo ASCX, e também considera importado namespaces presente no elemento web.config de <configuration><system.web><pages><namespaces>, tweak se obter definições desconhecidos que aparecem durante o processo de implantação.

Tenha um pouco de paciência de reposição, é muito complicado! Mas você obter algum bom re UserControls distribuíveis no final do it!

Ufa!

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