Como criar um site ASP.NET MVC modular

14

Estou no estágio de planejamento para a criação de um sistema de intranet de funcionários com o ASP.NET MVC 4. Gostaríamos que o site consistisse em "módulos" separados, cada um com um recurso diferente: mensagens, alterações na folha de pagamento etc. Gostaria que esses módulos pudessem ser habilitados ou desabilitados em tempo de compilação. A página inicial exibirá algum tipo de navegação que será vinculado a cada módulo carregado.

Até agora, isso é fácil, mas não quero que o recurso de navegação precise conhecer os módulos com antecedência. Em outras palavras, quero que os módulos sejam dinamicamente detectáveis; Quero poder escrever o código para um novo módulo e adicionar um link à barra de navegação sem alterações de código em nenhum outro local da fonte. Cada módulo deve ter alguma maneira de se registrar na barra de navegação e, o que é mais importante, isso deve ser feito para cada módulo à medida que é carregado.

Acredito que isso impede o uso das Áreas do MVC, pois elas foram projetadas para o caso em que o layout do site é conhecido anteriormente. Parece que o MEF pode ser apropriado, embora as pessoas pareçam ter tido sucesso misto na combinação do MEF com o MVC. O MEF é realmente o caminho a seguir aqui ou existe uma maneira melhor de realizar o que eu preciso?

Bdesham
fonte
Boa pergunta, acho que sua solução provavelmente girará em torno do uso da reflexão. Você ainda pode usar áreas ao criar seus itens, mas seu método de criação do menu precisará de reflexão para obter todos os seus tipos (para salvar a alteração do código). E se todos eles implementarem a mesma interface IModule interface. Você poderia, então, encontrar todos os inheritants da interface para obter todos os módulos que você precisa para link para, problema, então, é como exatamente você vai associar isso com um link, sem quaisquer dados adicionais? Hmm os engrossa lote ...
mattytommo
1
Parece-me que você deseja criar um CMS, exceto que, em vez de fazer a administração do CMS de dentro do CMS, você deseja que seja feito no momento da criação. O que me leva à pergunta: por que você quer que seja feito no momento da construção?
James P. Wright.
@ JamesP.Wright Bem, a razão pela qual eu queria fazê-lo no momento da compilação foi apenas porque parecia que seria mais simples do que expor essa funcionalidade através de uma página no site. (Além disso, o conjunto de módulos usados ​​raramente é alterado o suficiente para que a sobrecarga adicional desse tipo de seleção dinâmica não seja necessária.) Mas, realmente, mais importante do que selecionar módulos em tempo de construção é a capacidade do aplicativo de encontrar os módulos em o primeiro lugar, que é mais o impulso da minha pergunta.
bdesham
O nopCommerce ( nopcommerce.com/documentation.aspx ) é em parte um bom exemplo de sua preferência . Veja como escrever um plugin e sua abordagem para DI.
Rui Marques
Para fins de pesquisa, fiquei curioso em saber qual era o 'sucesso misto' na combinação do MEF com o MVC. Como o codeplex é "Vivendo no arquivo" atualmente, o link fornecido pelo OP não funciona mais. Para alguém de reposição então o tempo: pesquisa com ctrl + f para 'MEF2 com MVC4 via Microsoft.Composition' no separador-discussão sobre archive.codeplex.com/?p=mef ;)
Kevin

Respostas:

4

Primeiro, eu teria uma classe centralizada usada para o aplicativo registrar módulos compilados com um construtor estático e um membro estático Lista de módulos que estavam no sistema. Os módulos teriam uma propriedade estática indicando se é um item de menu ou não e em que ordem ele deve aparecer no menu.

Cada módulo teria seu próprio construtor estático que se notaria na classe centralizada que acompanha os módulos.

Pense neste sistema mais como um sistema de relógio de ponto em que os funcionários entram e cronometram. Então, no horário da folha de pagamento, sabemos que pagamos a todos os funcionários com base em quem fez o horário, etc.

O Reflection também pode ser usado se você tiver um contrato de interface nos módulos que eles devem herdar, que vincula informações de metapropriedades a ele.

Trabalhei na Warner Brothers Music e fiz um sistema interno de processamento de música para diferentes formatos de codificação. Eu criei um modelo genérico de plug-in para codificação com reflexão que usava herança para que pudesse ser convertida em reflexão para obter as meta propriedades básicas da classe. Ainda não tentei usar uma classe centralizada estática. Apenas pensei nisso aleatoriamente como outra maneira de tentar se divertir.

Eu também acrescentaria que usei o MVC atendendo a vários clientes com uma linha de base de requisitos, mas também com recursos aprimorados semelhantes ao que você está tentando fazer. Em vez disso, converti o MVC para o App_Code, em vez de exigir uma compilação. É mais fácil enviar arquivos dessa maneira sem a necessidade de uma compilação centralizada.

Você pode aproveitar o JIT com push FTP ou GIT simples, em vez de precisar compilar localmente e enviar DLLs.

Aqui está um link para esse artigo sobre estouro de pilha

Jason Sebring
fonte
Isso soa semelhante ao que eu estava imaginando. O único problema é: como faço para carregar os módulos em primeiro lugar? Por qual mecanismo eu digo a cada um deles para se registrar na classe central? É aqui que o MEF parece apropriado.
bdesham
MEF é melhor. Eu estava dando idéias sem investigá-lo, mas eu teria usado o MEF se tivesse essa opção se fosse lançada quando fiz esses projetos. Parece uma boa ideia. Não vejo por que você não pode combinar MEF e MVC.
Jason Sebring