É um fato da vida que as organizações têm aplicativos diferentes usando versões diferentes das mesmas classes porque foram desenvolvidas em momentos diferentes e não conseguem acompanhar. Também é um fato da vida que esses aplicativos geralmente precisam compartilhar dados entre si.
Você pode fazer isso através do banco de dados. No entanto, isso é lento e não escalável. O que você realmente quer é compartilhar objetos através de um cache distribuído que é rápido e escalável. Mas, o compartilhamento de objetos em tempo de execução levanta imediatamente a questão da compatibilidade de versão.
Uma maneira de fazer isso é por meio do XML, no qual você pode transformar uma versão de um objeto em outra. Mas é extremamente lento. Outra maneira é implementar sua própria transformação personalizada que pega uma versão de objeto e a transforma em outra versão. Mas, você tem que manter isso, o que é muito esforço para você.
Não seria bom se o cache distribuído de alguma forma cuidasse da compatibilidade de versão para você? Nós vamos, NCache faz exatamente isso. NCache fornece uma transformação de objeto de nível binário entre diferentes versões. Você pode mapear diferentes versões através de um arquivo de configuração XML e NCache entende como transformar de uma versão para outra.
Além disso, desde NCache armazena todas essas diferentes versões em um formato binário (em vez de XML), o tamanho dos dados permanece muito compacto e pequeno e, portanto, rápido. Em um ambiente de alto tráfego, o tamanho do objeto resulta em muito consumo de largura de banda extra, que tem seu próprio custo associado.
Aqui está um exemplo de NCache config.ncconf com mapeamento de versão de classe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<cache-config name="myInteropCache" inproc="False" config-id="0" last-modified="" type="clustered-cache" auto-start="False"> ... <data-sharing> <type id="1001" handle="Employee" portable="True"> <attribute-list> <attribute name="_Name" type="System.String" order="1"> <attribute name="_Age" type="System.Int32" order="2"> <attribute name="_Address" type="System.String" order="3"> <attribute name="_ID" type="System.String" order="4"> <attribute name="_PostalAddress" type="System.String" order="5"> </attribute></attribute></attribute></attribute></attribute></attribute-list> <class name="DataModel.Employee:1.0.0.0" handle-id="1" assembly="DataModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" type="net"> <attribute name="_Name" type="System.String" order="1"> <attribute name="_Age" type="System.Int32" order="2"> <attribute name="_Address" type="System.String" order="3"> </attribute></attribute></attribute></class> <class name="DataModel.Employee:2.0.0.0" handle-id="2" assembly="DataModel, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" type="net"> <attribute name="_ID" type="System.String" order="4"> <attribute name="_Name" type="System.String" order="1"> <attribute name="_Age" type="System.Int32" order="2"> <attribute name="_PostalAddress" type="System.String" order="3"> </attribute></attribute></attribute></attribute></class> </type> </data-sharing> ... </cache-config> |
como funciona NCache faça?
No arquivo config.nconf que você vê acima, você notará que a classe Employee tem um conjunto de atributos definidos primeiro. Esses são atributos independentes da versão e aparecem em todas as versões. Este é, na verdade, um superconjunto de todos os atributos que aparecem em diferentes versões. Abaixo disso, você especifica os atributos específicos da versão e os mapeia para os atributos independentes da versão acima.
Digamos que você salvou a versão Employee 1.0.0.0, que tinha um subconjunto da versão Employee 2.0.0.0. Agora, quando outro aplicativo tenta buscar o mesmo Employee, mas quer vê-lo como versão 2.0.0.0, NCache sabe quais atributos da versão 2.0.0.0 preencher com dados e quais deixar em branco.
Em segundo lugar, na configuração de exemplo acima, você notará que a versão 2.0.0.0 do funcionário não possui o campo Endereço, embora a versão 1.0.0.0 o tenha. Então, neste caso, quando NCache tenta ler o Funcionário 1.0.0.0 armazenado no cache e tenta transformá-lo para o Funcionário versão 2.0.0.0, sabe que não deve copiar o campo Endereço porque não existe nesta versão mais recente.
Existem muitos outros cenários que NCache lida perfeitamente para você. Leia a documentação on-line do produto para obter mais detalhes sobre isso.
Finalmente, a melhor parte de tudo isso é que você não precisa escrever nenhum código de serialização ou fazer nenhuma alteração de código em seu aplicativo para usar isso NCache recurso. NCache implementou um mecanismo de geração de código em tempo de execução, que gera código de serialização e desserialização na memória de suas classes em tempo de execução e usa o formulário compilado que é muito rápido.
Em resumo, usando NCache agora você pode compartilhar diferentes versões de objetos entre seus aplicativos sem modificar o código do aplicativo.