【问题标题】:Windsor Typed Factory facility, passing arguments when using singleton lifestyleWindsor Typed Factory 设施,在使用单身生活方式时传递参数
【发布时间】:2011-04-27 01:09:38
【问题描述】:

我正在使用Castle Windsor

我有两种组件类型,可以在运行时在 GUI 上选择实现。为了解决这个问题,我正在按名称解析它们。为了通过名称处理它们,我使用Typed Factory Facility

其中一种组件类型依赖于另一种。为了处理依赖关系,我将参数作为工厂方法/构造函数参数传递。

这里是这个工厂界面的编辑和删节版本:

public interface IModelFactory
{
    IMyDomainCommandFactory GetFooCommandFactory();
    IMyDomainCommandFactory GetBarCommandFactory();
    IMyDomainStrategy GetCreateSpecificSizeStrategy(int size, IMyDomainCommandFactory commandFactory);
    IMyDomainStrategy GetCreateUntilFailureStrategy(IMyDomainCommandFactory commandFactory);
}

请注意,我使用我自己的 IMyDomainCommandFactory 实现,而不是使用 Typed Factory 工具。这些工厂的行为是故意复杂的,而且设施不适合他们的需求。

我注意到的问题是,如果我使用单例生活方式注册我的策略组件,我总是会返回相同的实例,即使我将不同的参数传递给 getter。

在我看来,这违背了Principal of Least Astonishment,但也许其他人有不同的看法:) 这应该被视为一个错误吗?

如果没有,是否有一种干净的方法可以让容器或工厂为每个参数组合只创建一个实例?

【问题讨论】:

    标签: singleton castle-windsor typed-factory-facility


    【解决方案1】:

    取决于你如何看待它,但肯定不能将每个参数组合的实例称为单例,所以我说如果 Windsor 确实实现了你所期望的行为,它将与 PoLA 相悖。

    如果你想要,你需要一种定制的、非单身的生活方式。

    【讨论】:

    • 好的,现在我想多了,你说得对。这对于单例来说是可以预料的。所以,也许问题在于单例与工厂设施结合时并不是一个完美的默认选项。或者,也许我只是 IoC 的新手;)您能否在答案中链接到首选的自定义生活方式文档?我看到了两组文档,我不确定哪一组更适合链接。
    • docs.castleproject.org/Windsor.LifeStyles.ashxcastleproject.org/container/documentation/v1rc3/usersguide/… ?此外,事实证明我太早绑定依赖项,这导致了问题:) 我可以修改 IMyDomainStrategy 的方法以采用 IMyDomainCommandFactory 并避免这整个混乱。
    • @Merlyn Morgan-Graham re: docs - 显然是新的。旧的将被完全删除。
    • re “当与工厂设施耦合时,单例并不是一个完美的默认选项”可以将它与任何其他组件一样与工厂一起使用,并且您可以像任何其他组件一样在没有工厂的情况下使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多