1

IOC を使用してオブジェクトを挿入していますが、オブジェクトの内部キャッシュのため、呼び出されるたびにオブジェクトの新しいインスタンスを確保したいと考えています。以下のコードは、最初にインスタンスを作成するために機能しますが、インスタンスを保持しているようで、後続の呼び出しでそれを再利用しています

_container = new WindsorContainer().Install(
    FromAssembly.Containing<RepositoryInstaller>());

_container.AddFacility<TypedFactoryFacility>();

_container.Register(
    Component.For<Func<MyUnitOfWork>>()
        .Instance(() => {  
            return _container.Resolve<MyUnitOfWork>(); 
        }).LifeStyle.Transient);

私が望むのは、解決された Func インスタンスを呼び出すことができるようにすることですが、IOC コンテナーに MyUnitOfWork の新しいインスタンスを毎回提供してもらうことです。

//invoke FUNC and ensure that instance of MyUnitOfWork is created every time
var newInstance = myInstance();
4

1 に答える 1

1

func を毎回新しいインスタンスにしたいのか、それとも作業単位を毎回新しいインスタンスにしたいのか、あなたの質問からはわかりません。

前者の場合、インスタンスに状態がないため、それがどのように問題になるかわかりません。

後者の場合、MyUnitOfWork をコンテナー (おそらく RepositoryInstaller) に登録するコードを表示できますか? 一時的なライフスタイルにそれを登録していないと思います。Func は、表示されているコードで一時的に登録しているもののようです (MyUnitOfWork 自体ではありません)。

編集:あなたの編集に基づいて、MyUnitOfWorkをTransientとして登録していないことが私の最善の推測です。この行はFuncを一時的なものとして登録しているようです:

_container.Register(Component.For<Func<MyUnitOfWork>>().Instance(() 
=> {  return _container.Resolve<MyUnitOfWork>(); }).LifeStyle.Transient);

RepositoryInstaller コードを表示できますか?

于 2013-08-08T15:07:08.030 に答える