イントロ
今日は、Sapphireタグの下にある最初のコンポーネントのプロトタイプについてお話します。 これはREPL WebPartです。 このWebパーツは、SharePointのサーバー側で操作上の変更を行うこと、およびスクリプトのリモート実行とコードの一部のテストを目的としています。
前身
このWebパーツの作成は、十分な速度でサーバーコードを実行し、手元の開発ツールにアクセスできないというかなり頻繁なニーズで開始されました。
ここには、Repl WebPartの機能を示すための小さなプレゼンテーションがあります
。SapphireEnvironment Repl WebPartスライドに加えて、WebパーツはPythonのみが使用可能な言語のDynamic Languages Runtimeの古典的なホスティングであるという事実について説明します。
本体
それから私はそれがすべて私のためにうまくいった方法について話したかったので、プロジェクトにはいくつかの主要なモジュールが含まれています:
それらについてさらに詳しく。
言語ホスティング
このプロジェクトに実装したい言語の数に制限はないため、もちろん、それらを作成する抽象ファクトリーが必要です。これにより、使用可能なすべての言語の階層が非表示になり、インターフェースでカプセル化されます。
パブリック インターフェイス ILanguagesFactory
{ILanguage Create(
文字列名);
}パブリック インターフェイス ILanguage
{文字列 Name
{ get ;
}オブジェクト実行(
文字列入力);
void SetVar(
文字列名、
オブジェクト 値 );
オブジェクト GetVar(
文字列名);
}それでは、スクリプト言語の実装に必要なアセンブリがプロジェクトに参加しています。
Pythonをコードを実行するための環境として実装する準備がすべて整いましたので、始めましょう。
パブリック クラス PythonLanguage :ILanguage
{プライベート 読み取り専用 ScriptScope _scope;
公開 文字列名
{get { return "Python" ;
}}公開 PythonLanguage()
{_scope = Python.CreateEngine()。CreateScope();
}パブリック オブジェクト Execute(
文字列入力)
{ScriptSource source = _scope.Engine.CreateScriptSourceFromString(入力);
return source.Execute(_scope);
}}さらに、SharePointを操作するためのコンテキストを実装する必要があるため、タスクを少し複雑にします。これは次のようになります。
[テスト]
プライベート ボイド python_should_assume_sharepoint_variables()
{SPWeb fakeWeb = Isolate.Fake.Instance <SPWeb>();
Isolate.WhenCalled(()=> fakeWeb.Title).WillReturn(
"I'm fake web" );
var python = _factory.Create(
"Python" );
python.SetVar(
"__x__" 、
"123" );
python.SetVar(
"__web__" 、fakeWeb);
python.Execute(
"__x__ = __web __。Title" );
var x =(
string )python.GetVar(
"__x__" );
Assert.AreEqual(x、
“ I'm fake web” );
}IronPythonからSharePointオブジェクトを操作するには、いくつかのライブラリを追加する必要があります。
_scope.Engine.Runtime.LoadAssembly(
typeof (
string ).Assembly);
_scope.Engine.Runtime.LoadAssembly(
typeof (Uri).Assembly);
_scope.Engine.Runtime.LoadAssembly(
typeof (SPList).Assembly);
これは、動的言語での作業の基礎になります。
WebPart + WebControls
SPVisualDevを使用してプロジェクトを作成し、機能を追加します。その中にRepl WebPart Webパーツを作成します。他のすべてのアクションは標準ですが、わずかなニュアンスがあります。実行後に文字列値を表示できるオブジェクトが必要です。 これらの目的のために、コンソールという古典的な名前のオブジェクトを作成することにしました。その実装は非常に簡単です。
パブリック クラス コンソール{private readonly StringBuilder _messageBuilder =
new StringBuilder();
public void Write(
オブジェクトメッセージ)
{_messageBuilder.Append(メッセージ);
}public void WriteLine(
オブジェクトメッセージ)
{_messageBuilder.AppendLine(message.ToString());
}公開 文字列メッセージ
{得る{return _messageBuilder.ToString();
}}}それを言語ランタイムに渡し、コードを実行した後、そのMessageプロパティをポーリングし、その内容をWebパーツに表示します。
エンドボディ
すべてのプロジェクトソースはgithubで入手できます:
http :
//github.com/butaji/Sapphireまた、Sapphire.Environmentの暫定バージョン(ソリューションはWSPで提供されます)はCodePlexにマージできます:
http ://sapphire.codeplex.com/Release/ProjectReleases.aspx
? ReleaseId=34895