强制IOC在每次调用时创建新对象

时间:2013-08-08 15:00:35

标签: c# castle-windsor

我正在使用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();

1 个答案:

答案 0 :(得分:1)

我无法告诉您是否希望每次都将func作为新实例,或者每次都希望工作单元成为新实例。

如果是前者,我看不出它是如何重要的,因为实例没有状态。

如果是后者,是否可以显示在容器中注册MyUnitOfWork的代码(可能在RepositoryInstaller中)?我猜你没有用短暂的生活方式注册。看起来Func就是你在所显示的代码中注册为瞬态的(不是MyUnitOfWork本身)。

编辑:基于您的编辑,我最好的猜测是您没有将MyUnitOfWork注册为Transient。此行似乎将 Func 注册为瞬态:

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

你能展示RepositoryInstaller代码吗?