gpt4 book ai didi

caSTLe-windsor - CaSTLe Windsor - 如何按名称解析?

转载 作者:行者123 更新时间:2023-12-04 06:42:52 25 4
gpt4 key购买 nike

我的应用程序使用“SignalR”客户端/服务器通信框架。如果您不熟悉它,服务器端应用程序通常包含一个或多个“集线器”类(类似于 asmx 网络服务),每个类都提供可由客户端调用的方法。在启动期间,客户端需要首先创建一个连接,然后为它需要与之通信的每个集线器创建一个“代理”,例如:-

var hubConnection = new HubConnection("http://...");
var fooHubProxy = hubConnection.CreateHubProxy("FooHub");
var barHubProxy = hubConnection.CreateHubProxy("BarHub");
...etc...

传递给 CreateHubProxy() 的字符串参数是服务器端集线器类的名称。方法返回类型为 IHubProxy

感觉我应该可以在这里使用 Windsor,但我正在努力寻找解决方案。我的第一个想法是实例化集线器代理并向 Windsor(按名称)注册这些实例,例如

var fooHubProxy = hubConnection.CreateHubProxy("FooHub");
container.Register(Component.For<IHubProxy>().Instance(fooHubProxy).LifestyleSingleton().Named("FooHub"));
...etc...

问题是当一个类需要一个集线器代理时,通过名称解析它的唯一方法是使用服务定位器模式,这是不推荐的。其他哪些 Windsor 功能(例如类型化工厂等)在这里可能会有用?

编辑

我刚找到 Windsor 的 .UsingFactoryMethod,我想知道这是否可行,以简化集线器注册:

container.Register(Component.For<IHubProxy>()
.UsingFactoryMethod((kernel, context) => hubConnection.CreateHubProxy("FooHub"))
.LifestyleSingleton()
.Named("FooHub"));

我想我仍然有如何通过名称解析的问题。

最佳答案

两年后,但对于其他也遇到这个问题的人,我有一个更优雅的解决方案。可以使用 TypedFactory 设施并使其适应您的需求,如 here .首先创建工厂接口(interface)(仅!不需要实际实现,caSTLe 会处理):

public interface IHubProxyFactory
{
IHubProxy GetProxy(string proxyName);
}

现在我们需要一个类来扩展默认类型化工厂并从输入中检索组件名称 (proxyName):

class NamedTypeFactory : DefaultTypedFactoryComponentSelector
{
protected override string GetComponentName(MethodInfo method, object[] arguments)
{
string componentName = null;
if (arguments!= null && arguments.Length > 0)
{
componentName = arguments[0] as string;
}

if (string.IsNullOrEmpty(componentName))
componentName = base.GetComponentName(method, arguments);

return componentName;
}
}

然后向城堡注册工厂并指定将使用您的 NamedTypeFactory:

Component.For<IHubProxyFactory>().AsFactory(new NamedTypeFactory())

现在每个类都可以在其构造函数中获取工厂接口(interface):

public class SomeClass
{
private IHubProxy _fooHub;
private IHubProxy _barHub;

public SomeClass(IHubProxyFactory hubProxyFactory)
{
_fooHub = hubProxyFactory.GetProxy("FooHub");
_barHub = hubProxyFactory.GetProxy("BarHub");
}
}

关于caSTLe-windsor - CaSTLe Windsor - 如何按名称解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21752389/

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