C# 使用CastleWindsor注册IServiceBehavior的不同设置
我有一个在.dll中包含多个WCF服务的项目。项目使用温莎城堡。还有一个SecurityServiceBehavior实现了WCF服务应该使用的IServiceBehavior。SecurityServiceBehavior构造函数需要作为参数传递的ISecuritySettingsProvider。 在没有温莎的情况下,它是如何工作的: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
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”?显示如何设置覆盖。