none
AJUDA - Pluggable Architecture Asp.net MVC RRS feed

  • Pergunta

  • Olá pessoal, boa tarde!

    Preciso desenvolver uma aplicação Web que vai conter vários módulos de trabalho(Como um ERP), porem alguns clientes vão precisar de informações extras em alguns módulos, então preciso fazer uma aplicação modular e com a opção de injetar plugins que vão apenas complementar informações em uma tela.

    +/- assim: Um projeto Core em Asp.NET MVC e os módulos + Plugins por módulo.

    Segue 2 business entities:

    namespace Claims.BusinessEntities.Core
    {
        [DataContract]
        [KnownType(typeof(Countries.MXClaim))]
        public class Claim : BusinessEntityBase<Claim>
        {
    
            [DataMember]
            public int Id { get; set; }
    
            [DataMember]
            public string Code { get; set; }
    
        }
    }
    
    namespace Claims.BusinessEntities.Countries
    {
        public class MXClaim : Core.Claim
        {
            [DataMember]
            public int IdCore
            {
                get{ return base.Id; }
                set{ base.Id =value; }
            }
    
            /// <summary>
            /// Nro. ---
            /// </summary>
            [DataMember]
            public string company_fee { get; set; }
        }
    }


    Eu já criei uma aplicação Core e separei os módulos em projetos diferentes, mas não tenho ideia de como criar um Plugin para complementar um dado, e mapear esse dado do plugin na mesma model da tela onde o plugin foi injetado.

    Alguém pode me ajudar?

    PS. Já li esse post:http://www.codeproject.com/Articles/358360/NET-ASP-NET-MVC-plug-in-architecture-with-e, e não me ajudou pois ele cria um módulo completo, com controllers separadas.  Eu quero complementa-las de acordo com o usuário logado.

    Alguma luz? rs

    Obrigado,

    quarta-feira, 4 de fevereiro de 2015 16:09

Todas as Respostas

  • Kelvin,

    Acho que a solução passa pelo uso de injeção de dependência. Alguns exemplos bons contâineres deste tipo são o Unity (que faz parte do Enterprise Library), o NInject, o Spring.NET e o Autofac.

    Vc criaria então diferentes bibliotecas para um mesmo tipo de componente, sendo que via configuração definiria qual biblioteca utilizar (caráter plugável).

    Tenho alguns artigos publicados na revista .NET Magazine que talvez possam lhe ser úteis:

    http://www.devmedia.com.br/injecao-de-dependencia-com-ninject-artigo-revista-net-magazine-87/21605

    http://www.devmedia.com.br/microsoft-enterprise-library-injecao-de-dependencias-do-unity-application-block-parte-2/30350

    http://www.devmedia.com.br/microsoft-enterprise-library-parte-1/30155

    Espero ter ajudado.

    Abs

    quarta-feira, 4 de fevereiro de 2015 16:25
  • Olá Renato,

    Acho que nessa situação não vem ao caso utilizar algo do gênero pois eu pretendo mapear os plugins usando Reflection(Da na mesma...).  

    O maior problema é: Criei um plugin com um campo adicional chamado "teste", como eu vou mapear esse campo adicional do plugin na Controller do módulo principal?  Entende?

    Eu pensei na seguinte solução, mas não sei se é adequado.  Em cada plugin eu vou ter um Set que vai receber a classe base(O modelo) e esse método é responsável por setar o valor do campo teste na propriedade "teste". Então no metodo "Insert" da controller eu mapearia todos os plugins que estão sendo utilizados e chamaria o metodo Set deles para preencherem os campos.

    Mas não sei se é o melhor dos mundos.


    quarta-feira, 4 de fevereiro de 2015 16:35
  • Kelvin,

    Dei uma olhada no artigo que vc passou e compreendi melhor agora.

    Pensei em uma alternativa também, mas não sei se a mesma se adequaria ou não à sua necessidade. Para combinar diferentes plugins, vc poderia usar a classe ExpandoObject:

    https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject%28v=vs.110%29.aspx

    Esta estrutura é um tipo de dinâmico que permite adicionar em tempo de execução propriedades a um objeto, sem que isto implique na definição de uma classe com a estrutura que vc está montando. Conforme condições forem sendo atendidas, vc montaria um novo objeto combinando partes representadas pelos seus diferentes plugins.

    Como disse, é uma ideia. Aqui no trabalho utilizamos isto na implementação de Web APIs. Dependendo do tipo de produto comercializado, existem diferentes propriedades representando diversos tipos de informação. Analisando uma série de condições, montamos um objeto que é retornado ao se invocar um serviço (não há um contrato "rígido" como aqueles de WCF).

    quarta-feira, 4 de fevereiro de 2015 19:48