我通常使用使用单实例上下文模式的 WCF 服务。服务契约和行为也在 WCF 服务库中。
如果该服务作为 Windows 服务或 Web 服务托管,它们将获得自己的引用 WCF 服务库的项目。我喜欢保持这个 WCF 服务库运行(用于简单地使用 WCF 测试客户端进行调试),但是当我尝试通过行为类解决依赖关系时,它需要太多的努力。
使用 Castle Windsor,我还必须对Castle Windsor WCF Integration Facility进行额外配置。我只是想在服务启动时解决对象图,我觉得它不应该这么难。
我想,因为行为实例只创建一次,我应该能够将它用作组合根。我可以使用单个对象提供所有依赖项并从容器中解析它,如下所示:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SampleService : ISampleService, IDisposable
{
private readonly IServiceManager _serviceManager;
private readonly IWindsorContainer _container;
public SampleService()
{
_container = new WindsorContainer();
_container.Install(new ServiceInstaller());
_serviceManager = _container.Resolve<IServiceManager>();
}
public string GetMessage()
{
return _serviceManager.GetMessage();
}
public void Dispose()
{
_container.Dispose();
}
}
我知道明确要求容器解决依赖关系是个坏主意,但这让我免于很多麻烦。我可以保留默认的 WCF 配置,我可以运行 WCF 服务库进行调试,因为我现在有一个默认的构造函数。我也不必使用上次检查时缺少文档的 Castle Windsor WCF 集成设施。
我猜 Castle Windsor WCF 集成设施提供了更多功能,但我只想解决依赖关系。这种方法是否可能会导致一些问题?我还没有看到有人这样做,所以我想知道这是否合法使用。