我在.dll中有一个包含多个WCF服务的项目。项目使用Castle Windsor。还有一个SecurityServiceBehavior实现了WCF服务应该使用的IServiceBehavior。 SecurityServiceBehavior构造函数需要作为参数传递的ISecuritySettingsProvider。 如果没有温莎,它如何运作:
public class Service1Factory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
var host = base.CreateServiceHost(serviceType, baseAddresses);
ISettingsProvider settingsProvider = new Service1SettingsProvider();
host.Description.Behaviors.Add(new SecurityServiceBehavior(settingsProvider));
return host;
}
}
public class Service2Factory : ServiceHostFactory
{
//the same but uses Service2SettingsProvider instead of Service1SettingsProvider
然后我可以在.svc文件中使用这个工厂。现在,我是如何使用Windsor注册的:
Container.AddFacility<WcfFacility>();
Container.RegisterTransient<IServiceBehavior, SecurityServiceBehavior>();
Container.Register(Component.For<IService1>().
ImplementedBy<Service1>().LifeStyle.PerWcfSession());
Container.Register(Component.For<IService2>().
ImplementedBy<Service2>().LifeStyle.PerWcfSession());
//Need somehow fix this lines:
Container.Register(Component.For<ISecuritySettingsProvider>()
.ImplementedBy<Service1SettingsProvider>().LifestyleSingleton());
Container.Register(Component.For<ISecuritySettingsProvider>()
.ImplementedBy<Service2SettingsProvider>().LifestyleSingleton());
但它不会像我需要的那样工作因为我需要ServiceService的ServiceServiceBerhavior Service1SettingsProvider和Service2的Service2SettingsProvider。 最好的方法是什么?
答案 0 :(得分:1)
由于没有答案,我会发布我最终使用的解决方案。也许它也可以通过SubResolvers完成,但我还没有找到一种方法来了解哪些服务设置应该属于。而不是那样,我改变了Service1Factory来导出Windsor的DefaultServiceHostFactory,如下所示:
public class Service1Factory : DefaultServiceHostFactory
{
public Service1Factory()
: base(Service1Factory.CreateKernel())
{
}
private static IKernel CreateKernel()
{
var Container = AppContext.Container; // application container
var serviceContainer = new WindsorContainer();
serviceContainer.AddFacility<WcfFacility>();
serviceContainer.Register(Component.For<IService1>().ImplementedBy<Service1>().LifestyleTransient());
serviceContainer.Register(Component.For<IServiceBehavior>().ImplementedBy<SecurityServiceBehavior>().LifestyleTransient());
serviceContainer.Register(Component.For<ISecuritySettingsProvider>()
.ImplementedBy<Service1SettingsProvider>().LifestyleSingleton());
Container.AddChildContainer(serviceContainer);
return serviceContainer.Kernel;
}
}
通过派生DefaultServiceHostFactory并使用CreateKernel()方法,我提供了Service1,它是Windsor用于解析IServiceBehavior的唯一容器。但我也需要app Container,所以我使用了Windsor的儿童容器。 Service2Factory声明类似,但使用Service2和Service2SettingsProvider。