【发布时间】:2014-02-13 11:05:58
【问题描述】:
我的应用程序使用“SignalR”客户端/服务器通信框架。如果您不熟悉它,服务器端应用程序通常包含一个或多个“集线器”类(类似于 asmx Web 服务),每个都提供可由客户端调用的方法。在启动期间,客户端需要首先创建一个连接,然后为需要与之通信的每个集线器创建一个“代理”,例如:-
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...
问题是当一个类需要一个 hub 代理时,通过名称来解决它的唯一方法是使用服务定位器模式,不推荐这样做。还有哪些其他 Windsor 功能(例如类型化工厂等)可能在这里有用?
编辑
我刚刚找到了 Windsor 的 .UsingFactoryMethod,想知道这是否可行,以简化中心注册:
container.Register(Component.For<IHubProxy>()
.UsingFactoryMethod((kernel, context) => hubConnection.CreateHubProxy("FooHub"))
.LifestyleSingleton()
.Named("FooHub"));
我想我仍然有如何通过名称解决的问题。
【问题讨论】:
标签: castle-windsor