A linguagem Ruby vem ganhando muito espaço no mercado, talvez a linguagem dinâmica mais badalada atualmente, mas o objetivo do artigo não é ensinar Ruby, vuo mostrar como podemos integrar o C# com o Ruby.
Como não vou ensinar Ruby aqui, vou deixar aqui uma dica de quem considero referência quando o assunto é .NET + Ruby, que é o site do Vinicius Quaiato, ele também está estudando bastante o assunto, e sempre conversamos a respeito. Muito do que mostrarei aqui ele postou no blog dele, e claro tenho autorização do mesmo para utilizar alguns códigos dele aqui.
Eu sempre pensei que algumas partes dos softwares que desenvolvemos, deveriam ser mais flexíveis, o que eu quero dizer como flexível é o usuário, ou alguém de um setor de suporte, ou mesmo desenvolvedores, alterarem uma regra de negócio da aplicação sem precisar recompilar o software, abrir o Visual Studio e por ai vai.
Não vou entra no mérito da questão se o usuário vai entender o código, vai saber o que escrever, não vem ao caso, criar um parser de ruby ou outra linguagem para algo mais simples não é tão complicado.
Chega de falar, e vamos ao que interessa.
O primeiro passo é instalar o IronRuby.
Depois de instalado, referênciar as 3 .dll´s abaixo, que ficam no diretório bin da instalação do IronRuby.
- IronRuby.dll
- IronRuby.Libraries.dll
- Microsoft.Scripting.dll
A primeira classe que temos é chamada de EngineRuby que utiliza o padrão Singleton para armazenar uma instância da classe ScriptEngine que está disponível no namespace Microsoft.Scripting.Hosting.
A classe EngineRuby também tem um método ObterObjeto que recebe como parâmetro o nome do arquivo Ruby que contém a classe feita em Ruby que vamos utilizar, e o nome da classe feita com Ruby. Esse método retorna um tpo dinâmico do C#, atenção a keyword dynamic.
Para facilitar o entendimento, a idéia é ter uma pasta chamada Ruby no diretório da aplicação onde vamos armazenar os arquivos .rb do Ruby.
01 | public static class EngineRuby |
03 | private static ScriptEngine rubyEngine; |
05 | private static ScriptEngine CriarEngine() |
08 | rubyEngine = Ruby.CreateEngine(); |
13 | public static dynamic ObterObjeto(string nomeDoArquivo, string nomeDaClasse) |
15 | var diretorioDaAplicacao = Path.GetDirectoryName(typeof (EngineRuby).Assembly.Location); |
16 | var arquivo = Path.Combine(diretorioDaAplicacao, String.Format("Ruby\\{0}.rb", nomeDoArquivo)); |
18 | CriarEngine().ExecuteFile(arquivo); |
19 | dynamic objeto = CriarEngine().Runtime.Globals.GetVariable(nomeDaClasse); |
20 | return CriarEngine().Operations.CreateInstance(objeto); |
Bom, antes de continuar vamos falar do arquivo Ruby, para desenvolvedor códigos em Ruby, eu utilizo o RubyMine da JetBrains. É o melhor editor que encontrei até o momento.
Segue o código.