1

個々の Dsl .rb ファイルに存在するインスタンスを持ち、それらを CLR から実行する 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 プロパティを取得できるようにしたいと考えています。

現在、Dsl のインスタンスは次のようになっています。

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

現在、私の C# コードは次のようになっています。

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

Dsl インスタンスを汚染することなく @metadata プロパティを取得できる方法はありますか?

4

1 に答える 1

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 を作成しました。

モジュール間にネストされた完全修飾クラスにアクセスするための C# コードを作成できなかったため、Clr からのアクセスを提供する ClrAccessor クラスを作成しました。

私の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");

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

この「家を一周する」アプローチへの入力は大歓迎です。

于 2009-03-16T23:41:36.630 に答える