【发布时间】:2015-09-23 10:06:36
【问题描述】:
所以,我在 Windows 服务中实现了一个自托管的有状态 Wcf 服务。
我将此服务用作远程硬件驱动程序(有点)。
由于服务必须强制对底层硬件进行串行访问,因此我将服务设置为具有以下属性的唯一单个实例:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
它工作正常,但现在我想让 Castle 为我管理依赖项,麻烦就从这里开始。
我发现依赖注入和单实例模式不能很好地协同工作(here 是一个参考,但你可以找到更多谷歌搜索)...
请注意,我不能使用 Castle 提供的标准单例,因为我需要为系统中安装的每个设备使用不同的实例(可以同时有多个)。所以使用 Castle 默认生命周期对我来说不是一个选项。
编辑
根据要求,我添加了用于注册和解析服务的代码,即使我认为它非常标准并且没有什么需要强调的。
这是我用来注册服务的代码:
container.Register(Component.For<IMyService>().ImplementedBy<MyService>().LifeStyle.Transient);
这是我用来解析服务的代码:
public ServiceHostBase Build<T>(SelfHostConfiguration configuration)
{
// Service configuration is done by code, not by App.config
Uri[] uris = configuration.Select(e => e.Uri).ToArray();
var serviceName = typeof(T).AssemblyQualifiedName;
DefaultServiceHostFactory factory = new DefaultServiceHostFactory();
var serviceHost = factory.CreateServiceHost(serviceName, uris);
return serviceHost;
}
没什么特别的,真的,也许它还是有用的。
问题:有没有人能够让 Castle 和 InstanceContextMode.Single 一起工作?有可能吗?
你能分享你的解决方案/想法吗?
【问题讨论】:
-
如果 Windsor 提供您的实例,您还需要指定此属性吗?正如您在引用的另一个问题中所讨论的,单例是 Windsor 的默认生命周期,因此简单地删除该属性应该意味着您的服务只有一个实例。
-
是的,因为我有 N 个不同的服务实例(比如 5 个),每个实例驱动一个特定的外围设备。如果我使用 Castle 的单例,我会得到相同的服务实例而不是 5 个不同的实例。我为这个问题添加了一个简短的解释。感谢您指出这一点
-
好的。可以请您出示您的注册码吗?这将有助于了解这些多个实例是如何在 Windsor 中注册的。
-
@PhilDegenhardt 添加代码
-
然后您将在启动时为每个设备注册一个单例实例。由于您将拥有多个 IMyService 实例,因此您需要确保它们已命名,然后在配置 WCF 设施时使用这些名称为每个实例创建一个端点。
标签: c# wcf castle-windsor self-hosting instancecontextmode