我通常使用single instance context mode的WCF服务。服务合同和行为也在WCF服务库中。
如果服务作为Windows服务或Web服务托管,则它们会获得引用WCF服务库的项目。我喜欢保持此WCF服务库运行(仅用WCF测试客户端进行调试),但当我尝试通过行为类解析依赖项时,它需要too much effort。
使用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集成工具提供了更多功能,但我只想解决依赖关系。这种方法可能会导致一些问题吗?我没有看到有人这样做,所以我想知道这是否合法使用。