BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

Inversion of Control con WCF e Unity (Parte II)

Questo post è basato sul precedente Inversion of Control con WCF e Unity.

Nel post precedente abbiamo visto in che modo è possibile abilitare l’uso dell’IoC anche per i servizi WCF. Nell’esempio abbiamo visto però come creare il ServiceHost in applicazioni self-hosted. Per utilizzare il tutto anche in applicazioni ASP.NET e quindi in hosting su IIS dobbiamo implementare un ulteriore componente: il ServiceHostFactory.

Implementiamo quindi il nostro UnityServiceHostFactory:

  1: public class UnityServiceHostFactory : ServiceHostFactory
  2: {
  3:     protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
  4:     {
  5:         IUnityContainer unityContainer = null;
  6:         var configurationSection = 
  7:             (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
  8: 
  9:         string configurationName = GetConfigurationName(serviceType);
 10:         var unityContainerElement = 
 11:             configurationSection.Containers[configurationName];
 12:         if (unityContainerElement == null)
 13:         {
 14:             unityContainerElement = 
 15:                 configurationSection.Containers.Default;
 16:         }
 17: 
 18:         if (unityContainerElement != null)
 19:         {
 20:             unityContainer = new UnityContainer();
 21:             unityContainerElement.Configure(unityContainer);
 22:         }
 23: 
 24:         return new UnityServiceHost(unityContainer, serviceType, baseAddresses);
 25:     }
 26: 
 27:     private string GetConfigurationName(Type serviceType)
 28:     {
 29:         ServiceBehaviorAttribute serviceBehaviorAttribute = serviceType.GetCustomAttributes(true)
 30:             .OfType<ServiceBehaviorAttribute>()
 31:             .FirstOrDefault();
 32: 
 33:         return (serviceBehaviorAttribute != null &&
 34:             !string.IsNullOrEmpty(serviceBehaviorAttribute.ConfigurationName))
 35:                    ? serviceBehaviorAttribute.ConfigurationName
 36:                    : serviceType.FullName;
 37:     }
 38: }

Il metodo CreateServiceHost è quello invocato dal ServiceHostingEnvironment per la creazione, appunto, del ServiceHost. In questo metodo creiamo l’istanza dell’UnityContainer e poi la configuriamo sulla base di quanto indicato nel file di configurazione (web.config, in questo caso). La soluzione qui implementata cerca inizialmente, tra i containers, uno specifico il cui nome corrisponde al ConfigurationName eventualmente indicato nell’attributo ServiceBehavior dell’implementazione del servizio. Se non specificato, viene utilizzato il nome completo del tipo del servizio. Se però il container specifico non viene trovato, lo unityContainer viene configurato con il container di default (senza nome). Infine, viene creata l’istanza del ServiceHost passando lo unityContainer.

A questo punto specifichiamo nel file .svc l’utilizzo dello UnityServiceHostFactory:

  1: <%@ ServiceHost Language="C#" Debug="true" 
  2: Service="DotNetSide.WCF.IoC.Service.BookService, DotNetSide.WCF.IoC.Service"
  3: Factory="DotNetSide.WCF.IoC.Unity.UnityServiceHostFactory, DotNetSide.WCF.IoC.Unity" %>

Ora siamo pronti per eseguire la nostra applicazione. In allegato troverete il codice completo dell’esempio.

Anche qui il codice è reso volutamente molto semplice per evitare di essere troppo prolisso.

bye Smile

Comments

BlogServiceHost.Create() said:

Dalle puntate precedenti: Inversion of Control con WCF e Unity (Parte I) Inversion of Control con WCF

# March 28, 2009 12:25 PM