Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用CastleWindsor注册IServiceBehavior的不同设置_C#_Wcf_Castle Windsor - Fatal编程技术网

C# 使用CastleWindsor注册IServiceBehavior的不同设置

C# 使用CastleWindsor注册IServiceBehavior的不同设置,c#,wcf,castle-windsor,C#,Wcf,Castle Windsor,我有一个在.dll中包含多个WCF服务的项目。项目使用温莎城堡。还有一个SecurityServiceBehavior实现了WCF服务应该使用的IServiceBehavior。SecurityServiceBehavior构造函数需要作为参数传递的ISecuritySettingsProvider。 在没有温莎的情况下,它是如何工作的: public class Service1Factory : ServiceHostFactory { protected override Serv

我有一个在.dll中包含多个WCF服务的项目。项目使用温莎城堡。还有一个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());
Container.AddFacility();
Container.RegisterTransient();
Container.Register(Component.For()。
由()实现。lifesture.PerWcfSession());
Container.Register(Component.For()。
由()实现。lifesture.PerWcfSession());
//需要以某种方式修复这些行:
Container.Register(Component.For())
.ImplementedBy().LifestyleSingleton());
Container.Register(Component.For())
.ImplementedBy().LifestyleSingleton());
但它不会按我需要的方式工作,因为我需要SecurityServiceBehavior Service1SettingsProvider for Service1和Service2SettingsProvider for Service2。
最好的方法是什么?

因为没有答案,我将发布我最终使用的解决方案。也许它也可以通过子解析器来完成,但我还没有找到一种方法来理解服务设置应该属于哪个。相反,我将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;
    }
}
公共类Service1Factory:DefaultServiceHostFactory { 公共服务1工厂() :base(Service1Factory.CreateKernel()) { } 私有静态IKernel CreateKernel() { var Container=AppContext.Container;//应用程序容器 var serviceContainer=新的WindsorContainer(); serviceContainer.AddFacility(); serviceContainer.Register(Component.For().ImplementedBy().Lifestyle()); serviceContainer.Register(Component.For().ImplementedBy().Lifestyle()); serviceContainer.Register(组件.For()) .ImplementedBy().LifestyleSingleton()); Container.AddChildContainer(serviceContainer); 返回serviceContainer.Kernel; } } 通过派生DefaultServiceHostFactory并使用CreateKernel()方法,我提供了Service1,它是Windsor用于解析IServiceBehavior的唯一容器。但我也需要应用程序容器,所以我使用了Windsor的子容器。
Service2Factory声明为类似,但使用Service2和Service2SettingsProvider。

为每个服务指定不同的参数名称,并使用注册,您不能解释如何执行此操作吗?例如,我可以将参数传递给Service1构造函数,但我看不出它有什么帮助,因为您可以根据参数的名称定义不同的服务,以便Service1将ISettingsProvider service1settingsProvider作为参数,service2将ISettingsProvider service2settingsProvider作为参数。好的,所以我有:
类Service1:IService1{public ISettingsProvider service1settingsProvider{get;set;}public Service1(ISettingsProvider\u service1settingsProvider)…
如何将其与SecurityServiceBehavior的参数组合在一起?SecurityServiceBehavior是不同的类,如何向Windsor解释“如果要解析用于服务的IServiceBehavior,请查看service1settingsProvider name”?显示如何设置覆盖。