1

バージョン 4.0.3 から PetaPoco によって生成された Database.cs コードについて質問があります。以下のコード スニペットを参照してください。

public partial class postgresqlDB : Database
{
    public postgresqlDB() 
        : base("postgresql")
    {
        CommonConstruct();
    }

    public postgresqlDB(string connectionStringName) 
        : base(connectionStringName)
    {
        CommonConstruct();
    }

    partial void CommonConstruct();

    public interface IFactory
    {
        postgresqlDB GetInstance();
    }

    public static IFactory Factory { get; set; }
    public static postgresqlDB GetInstance()
    {
        if (_instance!=null)
            return _instance;

        if (Factory!=null)
            return Factory.GetInstance();
        else
            return new postgresqlDB();
    }

    [ThreadStatic] static postgresqlDB _instance;

    public override void OnBeginTransaction()
    {
        if (_instance==null)
            _instance=this;
    }

    public override void OnEndTransaction()
    {
        if (_instance==this)
            _instance=null;
    }
.....
..... <snip />

GetInstance()関数を見ると、return new postgresqlDB()がプライベート変数に割り当てられないのはなぜ_instanceですか?

これは、 へのすべての呼び出しGetInstance()が常に新しいインスタンスを作成することを意味するのでif (_instance != null) return _instance;はないでしょうか?

助けてくれてありがとう。

4

2 に答える 2

1

_instance フィールドを ThreadStatic に関連付けました。これは、アクセスに使用するスレッドごとにフィールドに異なる値があることを意味します。GetInstance が常に新しいスレッドで呼び出される場合、常に新しい値を持ちます (つまり、毎回コンストラクターを呼び出します)。

于 2012-07-24T03:02:28.353 に答える