我正在使用 Windsor 3.1.0 并LifestyleTransient
使用Typed Factory实例化一个组件。正如引用页面中所说,我必须释放从工厂获得的每个对象。但是我处于这样的场景中
class MyTypedFactory
{
MyTransientCommand CreateCommand();
void Release(MyTransientCommand command);
}
class MyTransientCommand
{
public void Execute() { }
}
class ClassA
{
public ClassB CommandPopulator { get; set; }
public void Foo()
{
List<MyTransientCommand> commands = new List<MyTransientCommand>();
CommandsPopulator.Commands = commands;
for (int i=0; i<100; ++i)
{
CommandsPopulator.Bar();
}
foreach (MyTransientCommand command in commands)
{
command.Execute();
}
}
}
class ClassB
{
public MyTypedFactory Factory { get; set; }
List<MyTransientCommand> Commands { get; set; }
public void Bar()
{
Commands.Add(Factory.CreateCommand());
}
}
这可能看起来过于复杂,但它说明了我的代码中的对象流。在这里,外部类 ( ClassB
) 使用类型化工厂创建的命令填充commands
队列。
当工厂不再需要它们时(在Execute
循环之后)释放这些对象成为整个问题。我可以在循环中释放,但释放方法本身的异常是不安全的。
class ClassA
{
public MyTypedFactory Factory { get; set; }
...
public void Foo()
{
...
foreach (MyTransientCommand command in commands)
{
command.Execute();
}
foreach (MyTransientCommand command in commands)
{
Factory.Release(command);
}
}
}
如果其中一个 Release 调用抛出其余对象将不会被释放并会造成内存泄漏(我知道这不应该发生,但我试图防止这种事情发生)。
是否可以MyTransientCommand
在创建后立即发布ClassB.Bar
?在方法返回之前,GC 不会释放它,ClassA.Foo
因为它包含对命令对象集合的引用。
如果进行 WCF 客户端调用并且 WCF 客户端是使用 Windsor 设置的,MyTransientCommand
是否可以发布?或者更一般地说,如果使用温莎提供的其他组件?ClassB.Bar
MyTransientCommand.Execute
MyTransientCommand.Execute
PS问题中的代码看起来是人为的和不自然的,确实如此。这是因为算法必须有副作用:在事务中更改数据库中的数据状态在某些情况下必须引发 WCF 调用。必须在事务完成后而不是在事务期间进行这些调用。