【问题标题】:Castle Windsor: Is there a way to override a component Id?Castle Windsor:有没有办法覆盖组件 ID?
【发布时间】:2009-07-10 19:41:35
【问题描述】:

我有以下注册码:

Component.For<IPublishingService>().ImplementedBy<UseStoredProcedureToPrintService>(),
Component.For<IConfirmationDialog<AutomatedTransaction>>().ImplementedBy<ShipmentConfirmationDialog>().Named("ShipmentConfirmationDialog"),
Component.For<IConfirmationService<AutomatedTransaction>>().ImplementedBy<SingleTransactionConfirmation>().ServiceOverrides(
    ServiceOverride.ForKey("shipmentDialog").Eq("ShipmentConfirmationDialog") ),

提出了一个要求,即在某些情况下,应用程序的行为应该有所不同。太好了,我想,这正是我开始使用温莎城堡的目的。

所以我编写了我的新组件并首先注册它们。例如,我以不同的方式实现 IPublishingService 并首先注册新的实现,以便在上面的默认实现上解析它。但是,在我别无选择只能使用 id 连接我的服务覆盖的少数情况下会出现问题。例如,如何在不修改上述代码的情况下重定向 ShipmentConfirmationDialog 的 ServiceOverride 以使用我的新 SpecialCaseShipmentConfirmationDialog 实现?

温莎城堡中有各种我不太了解的机制,比如转发和我希望能提供简单答案的 ActAs。

【问题讨论】:

    标签: inversion-of-control castle-windsor registration


    【解决方案1】:

    我会保持简单。如果它是可配置的,把它放在配置中(web.config / app.config)然后使用ConfigurationManager.AppSettings["shipmentDialogToUse"];加载ID

    还要记住,流畅的注册 API 并不是注册的全部和最终目的。 XML 仍然有其适合工作的时间和地点。

    【讨论】:

    • 我认为当您需要对已部署的应用程序进行更改时,它是适合该工作的工具。否则,只需将所有注册放入 Registrar 类并添加一个简单的动态发现机制,该机制可以找到 Registrar 所有本地 dll。就我而言,我有一个可以针对 2 个非常不同的数据库部署的应用程序,因此我需要使用不同的模型转换层和几个不同的 UI 屏幕来部署它。由于所有配置都是部署时的,我真的不明白为什么需要 xml 配置(尽管我也允许这样做)。点虽然。还是太糟糕了,没有覆盖机制。
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2021-02-02
    相关资源
    最近更新 更多