使用CastleWindsor为IServiceBehavior注册不同的设置

时间:2016-07-19 16:17:24

标签: c# wcf castle-windsor

我在.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。 最好的方法是什么?

1 个答案:

答案 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。