0

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() が行うことは、リフレクションを使用してプロパティ値を抽出し、追加のメタ データをロードして、別のデータベースの変更ログ テーブルにキーと値のような形式で書き込むことです。

問題は次のとおりです。

  1. Web アプリケーションは、PerWebRequest をスコープとする ISession を使用します。DefaultChangeLogger のライフサイクルは Singleton です。遅延ロードされた POCO を渡し、遅延ロードをトリガーする可能性のあるプロパティを評価している場合は、ISession を開く必要があります。ISession は、必要になるまでに閉じられる可能性があります。

NHibernate に POCO インスタンスを「ファイナライズ」させることは可能ですか? ファイナライズとは、遅延読み込みを特定のレベルに強制し、おそらく ISession を切断することを意味しますか?

IIS ワーカー スレッドと生成されたワーカー スレッドの間で上記のようなインスタンスを渡すことで、他の問題を予測できますか?

変更ログを実装する方法について何か良いアイデアはありますか? :)

洞察をありがとう。

4

1 に答える 1