ServiceHostFactory Kullanarak Barındırmayı Genişletme

Windows Communication Foundation'da (WCF) hizmetleri barındırmak için standart ServiceHost API, WCF mimarisinde bir genişletilebilirlik noktasıdır. Kullanıcılar, genellikle hizmeti açmadan önce varsayılan uç noktaları kesin olarak eklemek veya davranışları değiştirmek için kullanmak ServiceDescription üzere geçersiz kılmak OnOpening() için kendi konak sınıflarını 'den ServiceHosttüretebilir.

Kendi kendine konak ortamında, konağın örneğini oluşturan kodu yazdığınız ve örneği oluşturduktan sonra çağırdığınız Open() için özel ServiceHost oluşturmanız gerekmez. Bu iki adım arasında istediğiniz her şeyi yapabilirsiniz. Örneğin, yeni IServiceBehaviorbir ekleyebilirsiniz:

public static void Main()  
{  
   ServiceHost host = new ServiceHost( typeof( MyService ) );  
   host.Description.Add( new MyServiceBehavior() );  
   host.Open();  
  
   ...  
}  

Bu yaklaşım yeniden kullanılamaz. Açıklamayı işleyen kod konak programına (bu örnekte Main() işlevi) kodlanır, bu nedenle bu mantığı başka bağlamlarda yeniden kullanmak zordur. Kesinlik temelli kod gerektirmeyen bir IServiceBehavior eklemenin başka yolları da vardır. bir özniteliğini ServiceBehaviorAttribute türetebilir ve bunu hizmet uygulama türünüzde kullanabilir veya özel bir davranışı yapılandırılabilir hale getirerek yapılandırmayı kullanarak dinamik olarak oluşturabilirsiniz.

Ancak, bu sorunu çözmek için örneğin küçük bir varyasyonu da kullanılabilir. Bir yaklaşım, ServiceBehavior'ı öğesinin özel türevi yöntemine OnOpening ve dışına Main() ekleyen kodu taşımaktırServiceHost:

public class DerivedHost : ServiceHost  
{  
   public DerivedHost( Type t, params Uri baseAddresses ) :  
      base( t, baseAddresses ) {}  
  
   public override void OnOpening()  
   {  
  this.Description.Add( new MyServiceBehavior() );  
   }  
}  

Ardından, içinde Main() şunları kullanabilirsiniz:

public static void Main()  
{  
   ServiceHost host = new DerivedHost( typeof( MyService ) );  
   host.Open();  
  
   ...  
}  

Artık özel mantığı, birçok farklı konak yürütülebilir dosyası arasında kolayca yeniden kullanılabilen temiz bir soyutlamada kapsüllediniz.

Bu özel ServiceHost özelliğin Internet Information Services (IIS) veya Windows İşlem Etkinleştirme Hizmeti (WAS) içinden nasıl kullanılacağı hemen belli değildir. Barındırma ortamı uygulama adına örneğini veren ServiceHost ortam olduğundan, bu ortamlar kendi kendine konak ortamından farklıdır. IIS ve WAS barındırma altyapısı özel ServiceHost türeviniz hakkında hiçbir şey bilmiyor.

, ServiceHostFactory ÖZEL'inize ServiceHost IIS veya WAS içinden erişme sorununu çözmek için tasarlanmıştır. 'den ServiceHost türetilen özel bir konak dinamik olarak yapılandırıldığından ve çeşitli türlerde olabilir, barındırma ortamı hiçbir zaman doğrudan örnek oluşturmaz. Bunun yerine WCF, barındırma ortamı ile hizmetin somut türü arasında bir dolaylılık katmanı sağlamak için bir fabrika deseni kullanır. Aksini söylemediğiniz sürece, örneğini ServiceHostFactoryServiceHostdöndüren varsayılan uygulamasını kullanır. Ancak yönergesinde fabrika uygulamanızın @ServiceHost CLR türü adını belirterek türetilmiş ana bilgisayarınızı döndüren kendi fabrikanızı da sağlayabilirsiniz.

Amaç, temel durumlarda kendi fabrikanızı uygulama işleminin doğrudan bir alıştırma olması gerektiğidir. Örneğin, türetilmiş bir döndüren bir özel ServiceHostFactory öğe aşağıda verilmiştir ServiceHost:

public class DerivedFactory : ServiceHostFactory  
{  
   public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )  
   {  
      return new DerivedHost( t, baseAddresses )  
   }  
}  

Varsayılan fabrika yerine bu fabrikayı kullanmak için yönergesinde @ServiceHost aşağıdaki tür adını sağlayın:

<% @ServiceHost Factory="DerivedFactory" Service="MyService" %>

uygulamasından CreateServiceHostgeri döndürmek istediğiniz işlemi yapmak için ServiceHost teknik bir sınır olmasa da, fabrika uygulamalarınızı mümkün olduğunca basit tutmanızı öneririz. Çok sayıda özel mantığınız varsa, yeniden kullanılabilir olması için bu mantığı fabrikanın içinde yerine konağınızın içine koymak daha iyidir.

Barındırma API'sinde burada belirtilmesi gereken bir katman daha vardır. WCF'de ayrıca ServiceHostBase ve ServiceHostFactoryBaseServiceHost vardır. ServiceHostFactory Bu ve sırasıyla türetilir. Bunlar, meta veri sisteminin büyük bölümlerini kendi özelleştirilmiş oluşturmalarınızla değiştirmeniz gereken daha gelişmiş senaryolar için mevcuttur.