[翻訳] 接続先データ ソース拡張の検証およびデバッグ + データ ソース拡張エクスポートのベストプラクティス
みなさま今晩は。今は東京は夜の 23 時半ごろ、書き終わるころは日付が変わりそうな感じです。気づいたら師走、隣のマルエツで買ってむさぼり食う焼き芋が非常に美味な季節です。あえて皮から丸かじりしてたらマネージャが「この女、ありえねぇ」という顔をしていましたが気にしないです。だってみのさん(※)が皮ごと食べると胸焼けしないって言ってたですもん。
(※ = みのもんた)
とまあ世迷言はこの辺にしておいて、今日は身内やら仕事やら色々あって正直どんよりしていたのですが、ちょっと面白いことがあったので、元気になりました。この勢いを逃さず翻訳アップ行こうと思います。
さて今日のお題は…(サザエさん気味に)
"Testing and Debugging Connected Data Source Extensions"
接続先データ ソース拡張の検証およびデバッグ
"Best Practices for Data Source Extension Exports"
データ ソース拡張エクスポートのベストプラクティス
行ってみます!
(2009.1.4 追加)
まとめページを作りました。他のリファレンスを参照される際や、戻る際はこちらからどうぞです!
Microsoft Identity Integration Server 2003 Developer Reference
http://blogs.technet.com/jpilmblg/archive/2009/01/03/microsoft-identity-integration-server-2003-developer-reference.aspx
接続先データ ソース拡張の検証およびデバッグ
接続先データソース拡張の動作テストをするには、管理エージェントを MIIS サーバーと同じプロセスで実行します。管理エージェントを別のプロセスで実行すると、ブレークポイントに飛ぶことができません。
詳しい内容については、MIIS 拡張の動作テストおよびデバッグ を参照してください。
データ ソース拡張エクスポートのベスト プラクティス
接続先ディレクトリへのエクスポート処理中、エクスポート セッションでタイムアウトが発生すると問題が生じることがあります。このとき、アンマネージドオブジェクトに割り当てられたリソースは、開放が行われません。通常、エクスポートの場合、処理が完了すると、EndExport メソッドが呼び出されて、リソースの開放が行われます。しかしながら、タイムアウトが発生すると、通常は EndExport が呼び出されるオブジェクトにはアクセスすることができなくなります。
このような問題に対応するには、エクスポート処理の最中にタイムアウトが発生した場合に備え、アンマネージド リソースをクリーンアップするデストラクタをクラスごとに実装します。デストラクタには、アプリケーションドメインをアンロードし、エクスポート処理を中断するコードを記述します。詳しい内容については、 MSDN Library ウェブ サイトの Destructors を参照してください。
上記の問題が発生する可能性のある箇所は、次のインターフェイスを実装するクラスになります。
- IMAExtensibleCallExport
- IMAExtensibleFileImport
ただし、拡張モジュールに複数のデストラクタが存在している場合、一定の順序での呼び出しは保証されませんので注意が必要です。そのため、デストラクタを持つ 2 つのクラス間で参照を設定しないようにしてください。片方のクラスがも片方のリソースを使用中に、そのもう片方のクラスが破棄される可能性があるためです。
デストラクタおよびクリーンアップ コードの使用例については、後述のサンプルに示します。
try-finally 構文を使用する
デストラクタの他には、すべての拡張モジュールで try-finally ブロックを使用するといったやり方があります。try-finally 構文を使うと、try ブロック内に割り当てられたマネージドリソースは、finally ブロックでクリーンアップされます。try-finally ブロックは、GenerateImportFile や DeliverExportFileといった、各関数のエントリポイントで使用してください。詳しい内容については、MSDN Library ウェブ サイトの try-finally を参照してください。
エクスポートに使用するデータ ソース拡張用サンプルコード
次の C# コード サンプルは、デストラクタ、クリーンアップ構文、try-finally ブロックの用法を示したものです。
using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Collections.Specialized;
using Microsoft.MetadirectoryServices;
namespace Miis_CallExport
{
public class MACallExport :
IMAExtensibleFileImport,
IMAExtensibleCallExport
{
bool m_fInitialized; // リソースが初期化済みかどうかを示します。
//
// Constructor
//
public MACallExport(
)
{
//
// TODO: ここにコンストラクタロジックを追加します。
//
// クラスが初期化されていることを示すメンバ変数をセットします。
m_fInitialized = true;
}
//
// デストラクタ
//
~MACallExport()
{
if (m_fInitialized)
Cleanup(true);
}
//
// インポートおよびエクスポートに使用するクリーンアップ用ジェネリック関数です。
// クリーンアップは、例外の発生するインターフェイスがインポート、エクスポートに関係なく、必ず呼び出されます。また、万一関数がタイムアウトした場合にも呼び出されます。その場合、クリーンアップはデストラクタ(fFromDestructor にtrue がセットされます) から呼び出されます。ガーベージコレクションは非決定性であるため、クリーンアップが他のオブジェクトのインスタンスの存在に左右されることはないはずです。
//
public void Cleanup(
bool fFromDestructor
)
{
if (!fFromDestructor)
{
//
// TODO: クリーンアップロジックを追加します。
// このクラスのメンバオブジェクトにアクセスすることができます。
//
}
//
// TODO: このクラスのアンマネージドリソースを対象にしたクリーンアップロジックを追加します。
//
// リソースを開放したことを示すメンバ変数をセットします。
m_fInitialized = false;
}
public void GenerateImportFile(
string filename,
string connectTo,
string user,
string password,
ConfigParameterCollection configParameters,
bool fullImport,
TypeDescriptionCollection types,
ref string customData
)
{
try
{
//
// TODO: ここにインポートファイルを作成するロジックを追加します。
//
}
finally
{
//
// TODO: インポート固有のクリーンアップを実行するコードを追加します。
//
//
// リソースを開放するクリーンアップコードを呼び出します。
//
Cleanup(false);
}
}
public void BeginExport(
string connectTo,
string user,
string password,
ConfigParameterCollection configParameters,
TypeDescriptionCollection types
)
{
//
// TODO: エクスポートの実行を初期化するコードを追加します。
//
}
public void ExportEntry(
ModificationType modificationType,
string[] changedAttributes,
CSEntry csentry
)
{
//
// TODO: 1 つのエントリをターゲットにエクスポートするコードを追加します。
//
}
public void EndExport(
)
{
//
// TODO: エクスポート固有のクリーンアップを実行するコードを追加します。
//
//
// リソースを開放するクリーンアップコードを呼び出します。
//
Cleanup(false);
}
}
}
補足 :
下記の翻訳は正式な対応内容ではありません。そのため、内容についてご参照いただく際は必ず原文と併用してご参考にとどめていただければと存じます。また、翻訳順序は必ずしもデベロッパーリファレンスと合致しない場合もございますことをご了承ください。
◆閑話休題
以下は閑話休題なので、お暇なときにでも…。
さて、上でちょっとふれた元気になったことについてです。
この間、息子が人生初めて漢字を書いたのですが(来年小学校、勉強をしないでかせいでガチャガチャを激しくやりたいお年頃)、それが「つき破壊りょく」という意味不明なものだったとちょっとこのブログで触れたのですが、何がどう「つき」で、(月?突き??)「破壊」で、「りょく」なのか不明だったので、今日責め立ててやったところ衝撃の事実が。
まずこれが件のつき破壊りょくです。意味はまったく判りませんが、とにかく何だかものすごい力強さを感じます。
そして、これが真相です。

・・・そう来たか。
こどもってすごいですね。突きか月か、仮面ライダーキバらしいので「月」じゃないかなど、社内の一部で物議をかもし出したこの件も、まさかこんな落ちとは思いませんでした。
何かこれ見て、ノーベル賞の益川先生の子供時代「宿題やらないで親に二時間説教食らう」スピーチをみたら、元気になりました。
くっだらない話で恐縮ですが、職場のランチの話題や、どなたかをくどく時のねたにでもしていただければ本望です。
しかし、これは実は思い込みは恐ろしいということを改めて思い知ったわけでもあります。これが調査とかだったら、大変なことに…。
そういう意味では教訓になりました。絶えず可能性を頭に入れて動くべきなのですね。
それではまた!
~ういこう~