Ich habe ein Projekt mit mehreren WCF-Dienste innerhalb einer DLL. Projekt verwendet Schloss Windsor. Es gibt auch ein SecurityServiceBehavior implementiert IServiceBehavior, das WCF-Dienste verwenden sollten. Der SecurityServiceBehavior-Konstruktor benötigt den als Argument übergebenen ISecuritySettingsProvider. Wie es ohne Windsor funktioniert:Registrieren Sie verschiedene Einstellungen für IServiceBehavior mit CastleWindsor
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
Dann kann ich diese Fabriken in SVC-Datei verwenden. Nun, wie ich Registrierung dies mit 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());
Aber es wird nicht so funktionieren, ich brauche cos I SecurityServiceBehavior Service1SettingsProvider für Service1 und Service2SettingsProvider für Service2 benötigen. Was ist der beste Weg, das zu tun?
Geben Sie jedem Dienst einen anderen Parameternamen und registrieren Sie ihn jeweils mit [einer der in dieser Frage beschriebenen Techniken] (http://stackoverflow.com/questions/9339840/register-component-based-on-parameter- name- on-requestor-in-windsor) – stuartd
Kannst du mir nicht erklären, wie das geht? Ich kann Parameter an zB Service1-Konstruktor übergeben, aber ich sehe nicht, wie es helfen könnte. –
Weil Sie einen anderen Dienst ** basierend auf dem Namen des Parameters ** definieren können, so dass service1 'ISettingsProvider service1settingsProvider' und service2 nimmt 'ISettingsProvider service2settingsProvider' als Parameter an. – stuartd