3

Windsor Container にあまり詳しくなく、他の人が書いたコードを変更しています。PgDataAccess (独自のクラス) データ型プロパティを持つ WindsorContainer 内のすべてのオブジェクトを初期化するコードがあります。

public PgDataAccess da { get; set; }

コードは次のとおりです。

    _windsorContainer.Register(Component.For<PgDataAccess>().UsingFactoryMethod(() =>
        {
            var dataAccess = new PgDataAccess();
            dataAccess.ConnectionString = connectionString;
            return dataAccess;
        }));

いくつかのエラーによると、このコンテナー内のすべてのオブジェクトに同じ PgDataAccess クラス インスタンスが使用されているようです。この初期化を変更して、すべてのコンテナのオブジェクトに個別の PgDataAccess クラス インスタンスを登録するにはどうすればよいですか? 次の意味を持つもの:

foreach(component in _windsorContainer.Components.<PgDataAccess>())
{
    var dataAccess = new PgDataAccess();
    dataAccess.ConnectionString = connectionString;
    component.da = dataAccess;
}
4

1 に答える 1

4

「Singleton はデフォルトのライフスタイルであり、誰かを明示的に指定しない場合に使用される」ため、PgDataAccess のコード ライフスタイルはシングルトンです。

したがって、コードは次のようになります

_windsorContainer.Register(Component.For<PgDataAccess>()
    .LifestyleSingleton()
    .UsingFactoryMethod(() =>
    {
        var dataAccess = new PgDataAccess();
        dataAccess.ConnectionString = connectionString;
        return dataAccess;
    }));

依存するコンポーネントごとに PgDataAccess の新しいインスタンスが必要な場合は、それを一時的なものとして登録する必要があります。

_windsorContainer.Register(Component.For<PgDataAccess>()
    .LifestyleTransient()
    .UsingFactoryMethod(() =>
    {
        var dataAccess = new PgDataAccess();
        dataAccess.ConnectionString = connectionString;
        return dataAccess;
    }));

ライフスタイルの詳細については、こちらをご覧ください。

于 2013-10-12T12:46:21.747 に答える