Nhibernate によって遅延ロードされた POCO インスタンスで何ができるかについて、ちょっとしたアドバイスを探しています (違いがあれば流暢な NHibernate)。
変更ログの一般的な実装に取り組んでいます。完全にカスタムの実装を行う理由は、さまざまな目的に使用するために、変更データを非常に特殊な形式で書き込む必要があるためです。必要なすべての情報が POCO インスタンスから直接アクセスできるわけではなく、代わりに計算する必要があります。最終的に、変更データは運用データベースとは別のデータベースに書き込まれます。データを書き込む操作は、SqlCommand を使用して行われます。
実装は、現在の POCO クラスと将来の追加をサポートするために汎用的である必要があるため、リフレクションを使用して、変更ログの実装に渡される POCO のプロパティを抽出します。
私が持っているものは次のとおりです。
public interface IChangeLogger
{
void Log(BaseEntity entity);
}
BaseEntity は、すべての POCO が継承するクラスです。
実装は
public class DefaultChangeLogger : IChangeLogger
{
private readonly string _connectionString;
public DefaultChangeLogger()
{
var connectionString = ConfigurationManager.ConnectionStrings["ChangeLogger"];
Guard.Against<ConfigurationErrorsException>(connectionString == null || string.IsNullOrEmpty(connectionString.ConnectionString));
_connectionString = connectionString.ConnectionString;
}
public void LogChange(BaseEntity entity)
{
var logger = new SqlServerDirectChangeLogger(_connectionString, entity);
var starter = new ThreadStart(logger.Log);
var workerThread = new Thread(starter) { IsBackground = true };
workerThread.Start();
}
}
そして最後に、最終的なワーカーの実装:
public class SqlServerDirectChangeLogger
{
private readonly string _connectionString;
private readonly BaseEntity _entity;
public SqlServerDirectChangeLogger(string connectionString, BaseEntity entity)
{
_connectionString = connectionString;
_entity = entity;
}
public void Log()
{
}
}
別のスレッドを用意する理由は、アプリケーション (MVC3、IIS7.5) を停止させず、優先度の低いバックグラウンド スレッドで書式設定とログ記録を行うためです。フロント エンド ユーザーがレコードを更新するときに、ロガーが少し同期的に行う必要があるため、応答を遅らせたくありません。
したがって、SqlServerDirectChangeLogger.Log() が行うことは、リフレクションを使用してプロパティ値を抽出し、追加のメタ データをロードして、別のデータベースの変更ログ テーブルにキーと値のような形式で書き込むことです。
問題は次のとおりです。
- Web アプリケーションは、PerWebRequest をスコープとする ISession を使用します。DefaultChangeLogger のライフサイクルは Singleton です。遅延ロードされた POCO を渡し、遅延ロードをトリガーする可能性のあるプロパティを評価している場合は、ISession を開く必要があります。ISession は、必要になるまでに閉じられる可能性があります。
NHibernate に POCO インスタンスを「ファイナライズ」させることは可能ですか? ファイナライズとは、遅延読み込みを特定のレベルに強制し、おそらく ISession を切断することを意味しますか?
IIS ワーカー スレッドと生成されたワーカー スレッドの間で上記のようなインスタンスを渡すことで、他の問題を予測できますか?
変更ログを実装する方法について何か良いアイデアはありますか? :)
洞察をありがとう。