gpt4 book ai didi

c# - CaSTLe Windsor 中对象图的多个不同实例

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:25 26 4
gpt4 key购买 nike

这是我的设置的简化版本。我有一个使用库的应用程序,该库提供了一个用于访问某些 Web 服务的客户端。我的应用程序将其包装在提供一些更高级别操作的 XyzService 中。

该库提供了一个参数化的 Windsor 安装程序,它注册了 WebApiClient 及其依赖项。安装程序采用配置对象(除其他事项外)指定 Web 服务的 URI。

只要我只想与 Web 服务的单个实例对话,就可以了。但在这种情况下,实际上有两个不同的 Web 服务实例,并且它们不可互换。在启动时,我希望通过引用 XyzService 的两个不同实例来构造该应用程序,第一个具有配置为访问(例如)http://server.green/ 的对象图,第二个具有配置为访问(比如)http://server.red/ 的对象图。

这是一个图表:

Example object

左边是我只有两个 IxyzService 类型的构造函数参数时得到的结果。我得到了两个 WebApiClient 实例(因为它有短暂的生命周期),但它们共享相同的配置(因为安装程序创建了一个实例并注册了它)。

右边是我想要的。但我不确定如何提供两个 IWebApiClientConfigurations 并告诉 CaSTLe Windsor,当它为 App 解析 IXyzServices 时,它应该创建两个单独的对象图,第一个有一个配置,第二个有另一个。

我尝试了什么

起初我以为 typed factory可能是我想要的。我创建了一个这样的界面:

public interface IXyzServiceFactory
{
IXyzService GetXyzService(IWebApiClientConfiguration webApiClientConfiguration);
void Release(IXyzService xyzService);
}

然后这样注册:

container.Register(
Component.For<IXyzServiceFactory>()
.AsFactory());

我更改了我的应用程序以获取此工厂并使用它来请求 IxyzService 的两个实例,每次都传递不同的配置。我认为在尝试构建 WebApiService 时可能会使用该配置。然而:

  • 它没有用——我传入的配置对象被忽略了,我仍然得到了库安装程序提供的配置实例。
  • 即使它成功了,它也会很糟糕,因为它用配置对象和 XyzService 生命周期的知识弄乱了我的应用程序。

我想要什么

理想情况下,我想知道如何在调用 App 的构造函数时告诉 Windsor:

public App(IXyzService xyzService1, IXyzService xyzService2)

...它应该像往常一样为每个构造一个对象图,除了在解析 IWebApiClientConfiguration 时,第一个图应该获得一个实例,第二个图应该获得另一个实例。我想在应用程序的 Windsor 安装程序中实例化和注册 IWebApiClientConfiguration 的实例。

我不想在我的应用程序中复制库的 Windsor 安装程序,我想要它注册的所有内容 WebApiClientConfiguration。但如果没有办法解决它,我会忍受这样做。

虽然我对我可以用库做什么有限制,但我仍然对建议如何在没有这些限制的情况下处理这种情况的答案感兴趣。

注意事项

我目前使用的是 CaSTLe Windsor 2.5.3。我知道这已经很老了。如果解决方案需要它,我会愿意尝试升级,假设没有重大更改会阻止我使用该库及其现有安装程序。如果有,升级起来会相当困难。

我试图删除无关的细节,但又不会让事情变得如此抽象以至于动机不再明确。请让我知道是否有方法可以在不使问题过长的情况下澄清问题。

最佳答案

在 CaSTLe Windsor 的 3.x 版本中,您可以注册多个实现命名,然后在您的其他注册中显式指定命名依赖项。然后它看起来像这样(当然这个注册缺少实现,生活方式......但这些在这里并不重要):

container.Register(
// Register a config containing http://server.green/, set its name,
// and register a named IXyzService depending on the config.
Component.For<IWebApiClientConfiguration>().Named("greenConfig"),
Component.For<IXyzService>().Named("greenService")
.DependsOn(typeof (IWebApiClientConfiguration), "greenConfig"),

// Register another config of the same interface containing http://server.red/,
// and a named IXyzService that uses it.
Component.For<IWebApiClientConfiguration>().Named("redConfig"),
Component.For<IXyzService>().Named("redService")
.DependsOn(typeof (IWebApiClientConfiguration), "redConfig"));

然后您可以使用其名称作为键来解析该服务:

var greenService = container.Resolve<IXyzService>("greenService");
var redService = container.Resolve<IXyzService>("redService");

并且每个实例都将使用其指定的命名依赖项。

在您的 CaSTLe Windsor 2.5.3 版本中也应该有一种(不同的)方法来指定依赖项,尽管我没有使用过它,所以我不知道如何实现它。

关于c# - CaSTLe Windsor 中对象图的多个不同实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23697331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com