2009-03-16 8 views
1

個のDsl.rbファイルに存在するインスタンスを持つDslを作成しようとしていて、それらをCLRから実行しています。IronRuby Dslからの戻り値へのアクセス

IronRubyでClrオブジェクトの値を作成して設定し、 は、.rb Dslインスタンス ファイルが実行された後、何らかの形でCLRオブジェクトにアクセスします。ここで

は、現時点では非常に簡単です私のCLRオブジェクトである:

namespace Horn.Core.Dsl 
{ 
    public class BuildMetaData : IBuildMetaData 
    { 
     public string Description { get; set; } 
    } 
} 

私はDSLを指定すると、どの は、上記で指定BuildMetaDataのインスタンスを作成します使用しています以下のモジュールがあります。

module MetaBuilder 
    module Dsl 
    module Main 
     attr_accessor :metadata 
     def install(name, &block) 
     @metadata = Horn::Core::Dsl::BuildMetaData.new 
     yield self if block_given? 
     end 

     def description(desc) 
     @metadata.Description = desc 
     end 

     def get_metadata 
      @metadata 
     end 

    end 
    end 
end 

include MetaBuilder::Dsl::Main 

私は何とかDSLのインスタンスが走った後のClr コードから@metadataプロパティを取得できるようにしたいです。

var engine = Ruby.CreateEngine(); 
engine.Runtime.LoadAssembly(typeof(BuildMetaData).Assembly); 
engine.ExecuteFile(buildFile); 
var klass = engine.Runtime.Globals.GetVariable("get_metadata"); 

は私がすることなく、@metadataプロパティで取得することができますとにかくあります:私のC#コードは、現在このようになります

install :horn do 
    description "A .NET build and dependency manager" 
end 

DSLのインスタンスは、現在、このようになります。 Dslインスタンスを汚染しますか?

答えて

2

興味のある方は、 シングルトンを作成してBuildMetaDataクラスのインスタンスを格納することで解決できました。

私のRubyのコードは次のように見てしまった:

module MetaBuilder 
    module Dsl 
    module Main 

     def install(name, &block) 
     yield self if block_given? 
     end 

     def get_from(name, url) 
     puts name 
     puts url 
     end 

     def description(desc) 
     meta.metadata.Description = desc 
     end 

     class MetaDataAccessor 
     attr_accessor :metadata 

     private 
     def initialize 
      @metadata = Horn::Core::Dsl::BuildMetaData.new 
     end 

     public 
     def self.instance 
      @@instance ||= new 
     end 

     def self.get_metadata 
      @metadata 
     end 
     end 
    end 
    end 
end 

def meta 
    MetaBuilder::Dsl::Main::MetaDataAccessor.instance 
end 

class ClrAccessor 
    def get_build_metadata 
    meta.metadata 
    end 
end 

include MetaBuilder::Dsl::Main 

私はシングルトンBuildMetaData インスタンスを維持するためにMetaDataAccessorを作成しました。

がモジュール間でネストされているので、ClrAccessorクラスを作成して Clrからのアクセスを提供する完全修飾クラスにアクセスすることができませんでした。

私のC#のコードは次のように見てしまった:

var engine = Ruby.CreateEngine(); 
engine.Runtime.LoadAssembly(typeof(BuildMetaData).Assembly); 
engine.ExecuteFile(buildFile); 
var klass = engine.Runtime.Globals.GetVariable("ClrAccessor"); 
var instance = engine.Operations.CreateInstance(klass); 
buildMetaData = (BuildMetaData)engine.Operations.InvokeMember(instance, 
"get_build_metadata"); 

私はもっと簡単な方法があるとかなり確信している私にとって、それは進歩です。

この「ラウンド・ザ・ハウス」アプローチへのインプットは高く評価されます。

関連する問題