3

99%は、これは何を検索すればよいかわからないことを確信しているので、正しい用語を教えてください。

FluentNHibernateを使用してSQLiteバックエンドにデータを保存するプロジェクトに取り組んでいます。負荷が非常に低いです(起動時に数十回の読み取り、その後書き込みまたは2分後に高負荷として)私は他の何よりも書き込みを簡単にしようとしているので、それが欲しいので私はオブジェクトのプロパティを変更するだけで、自動的にバックエンドにフラッシュされます。私が言ったように、これは非常に低負荷のシングルユーザーアプリなので、(最悪の場合)1秒に5回の書き込みでもそれほど目立たないでしょう。

プロパティセッターでセーブを設定できることは知っていますが、冗長なコードを削減しようとしているので、それは私には過度に冗長に思えます。

私が探しているのはこんな感じです

class MainConfig
{
    public virtual bool Enabled { get; set; }
}

次に、それをコントロールにバインドできるため、コントロールへの変更がプロパティにヒットし、保存されます。

多くの余分なコードを使用して、私はそれを達成することができます

class MainConfig
{
    bool _Enabled;
    public virtual bool Enabled
    {
        get { return _Enabled; }
        set { _Enabled = value; mainSession.Save() }
    }
}

ここで、mainSessionは、アプリの存続期間を通じて静的なISessionです。

助言がありますか?

4

3 に答える 3

1

これは完璧なソリューションではありませんが、私が思いついたのは、すべての構成オブジェクトを処理し、そのオブジェクトとそのすべてのプロパティのプロキシを構築するT4テンプレートです。

class MainConfigProxy : MainConfig
{
    public override Enabled
    {
         get { return base.Enabled; }
         set
         {
             base.Enabled = value;
             mainSession.Save();
         }
    }
}

次に、基本クラスとそのプロキシを含むタイプからタイプへの辞書を作成します。

次に、私のコードはその辞書をチェックし、プロキシがある場合は、代わりにそれをロード/インスタンス化します。完璧ではありませんが、多くのタイピングを節約できます

于 2012-12-30T14:25:55.753 に答える
0

あなたがする必要があるのはあなたのセッションをフラッシュすることです。次の例は、nHibernateリファレンスドキュメントからのものです。

sess = sf.OpenSession();
ITransaction tx = sess.BeginTransaction();
sess.FlushMode = FlushMode.Commit; //allow queries to return stale state
Cat izi = (Cat) sess.Load(typeof(Cat), id);
izi.Name = "iznizi";
// execute some queries....
sess.Find("from Cat as cat left outer join cat.Kittens kitten");
//change to izi is not flushed!
...
tx.Commit(); //flush occurs

ドキュメントには、自動フラッシュが発生する場合もあると記載されていることに注意してください(つまり、前述の例のように開始する必要はありません)。これはあなたにとって朗報です。なぜなら、それは実際にあなたが探しているものの一種だからです。

于 2012-12-30T00:24:46.333 に答える
0

開発しているプラ​​ットフォームを指定しませんが、一般にデータバインディングを使用しているため、最も簡単なアプローチは、すべてのコントロールの変更されたイベントにイベントハンドラーをアタッチすることです。変更されたイベントが発生すると、データバインドされたオブジェクトが変更され、変更をデータベースにフラッシュできます。

于 2012-12-30T14:09:41.703 に答える