我用的是温莎城堡
我有两种组件类型,可以在GUI运行时选择它们的实现。为了处理这个问题,我按名称解析它们。为了按名称解析它们,我使用了类型化工厂设施。
一个组件类型依赖于另一个。为了处理依赖关系,我将参数作为工厂方法/构造函数参数传递。
下面是这个工厂接口的编辑和删节版本:
public interface IModelFactory
{
IMyDomainCommandFactory GetFooCommandFactory();
IMyDomainCommandFactory GetBarCommandFactory();
IMyDomainStrategy GetCreateSpecificSizeStrategy(int size, IMyDomainCommandFactory commandFactory);
IMyDomainStrategy GetCreateUntilFailureStrategy(IMyDomainCommandFactory commandFactory);
}
请注意,我使用自己的IMyDomainCommandFactory
实现,而不是使用类型化工厂功能。那些工厂故意制造复杂的行为,设施不适合他们的需要。
我注意到的问题是,如果我用单例方式注册我的策略组件,我总是得到相同的实例,即使我向getter传递不同的参数。
在我看来,这违背了最少惊讶原则,但也许其他人有不同的意见:)这应该被认为是一个bug吗?
如果没有,是否有一种干净的方法让容器或工厂每个参数组合只创建一个实例?
取决于你如何看待它,但是每个实例的参数组合肯定不能被称为单例,所以我说如果Windsor确实实现了你所期望的行为,它将违背PoLA。
如果你想要它,你需要一个自定义的,非单态的生活方式。