2009-12-15 23 views
6

Sadece MEF'ye giriyorum ve çözemediğim bir problemle karşılaştım. Benim DLL'ler (MEF üzerinden) okuyan bir windows hizmeti var ve her DLL bir WCF Service Host. Windows hizmeti çalıştırdığımda ve DLL'lerde okuduğumda, her şey iyi çalışır, WCF DLL'lerinden biri herhangi bir "etkinlik" aldığında, daha sonra onları yeniden çalıştırır ve sonra gelen verileri işler. Başta bir kez başlatmaları gerekir. Mümkün mü?MEF + WCF Service Host?

cevap

4

WCF hizmetleri varsayılan. Bu, her gelen yöntem çağrısı için WCF hizmetinizin yeni bir örneğinin başlatıldığı anlamına gelir. İstediğiniz şey, bir tekil örnek modu gibi geliyor, ancak eğer bir sorun olursa, bunu önlemek istersiniz.

Bunun etrafında aldığım yol, çağrı modu başına numaralı telefonu kullanmaktır, ancak erişimi senkronize ettiğim sahnelerin arkasında statik bir veri deposu var. Bu en azından, bağlantı kurulduktan sonra veri deposu kullanımdayken anlık olarak bloke olsalar bile müşterilerin bağlanmasına izin verir.

Daha fazla bilgi için System.ServiceModel.InstanceContextMode numaralı MSDN yardımına bakın.

4

Sen, bir IServiceBehavior ve IInstanceProvider uygulayan OnStart içinde IServiceBehavior benim implmentation kayıt ve IInstanceProvider sizin için nesne ömrünü yönetmek suretiyle bu işleyebilir. Özellikle, her istekte servis türünüzün aynı örneğini sunan denetim konteynerinin tersine çevirisini kullanabilirsiniz (yani, tekil olmayan tekton benzeri davranış). Çağrı örneği modu başına için

public partial class MyServiceHost : ServiceBase { 
    // details elided 

    protected override void OnStart(string[] args) { 
      this.Host = new ServiceHost(typeof(MySerivce)); 
      this.Host.Description.Behaviors.Add(new MyServiceBehavior()); 
      this.Host.Open(); 
    } 
} 

public class MyServiceBehavior : IServiceBehavior { 
    public void AddBindingParameters(
     ServiceDescription serviceDescription, 
     ServiceHostBase serviceHostBase, 
     Collection<ServiceEndpoint> endpoints, 
     BindingParameterCollection bindingParameters 
    ) { } 

    public void ApplyDispatchBehavior(
     ServiceDescription serviceDescription, 
     ServiceHostBase serviceHostBase) { 
      IIoCContainer container = new IocContainer(); 
      foreach (var cdBase in serviceHostBase.ChannelDispatchers) { 
       ChannelDispatcher cd = cdBase as ChannelDispatcher; 
       if (cd != null) { 
        foreach (EndpointDispatcher ed in cd.Endpoints) { 
         ed.DispatchRuntime.InstanceProvider = new MyInstanceProvider(
          container, 
          serviceDescription.ServiceType 
         ); 
        } 
       } 
      } 
     } 

    public void Validate(
     ServiceDescription serviceDescription, 
     ServiceHostBase serviceHostBase 
    ) { } 
} 

public class MyInstanceProvider : IInstanceProvider { 
    readonly IIocContainer _container; 
    readonly Type _serviceType; 

    public InstanceProvider(IIoCContainer container, Type serviceType) { 
     _container = container; 
     _serviceType = serviceType; 
    } 

    public object GetInstance(InstanceContext instanceContext, Message message) { 
     return _container.Resolve(_serviceType); 
    } 

    public object GetInstance(InstanceContext instanceContext) { 
     return GetInstance(instanceContext, null); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object instance) { }  
} 
+0

Sanırım bana küçük bir örnek verebilir misiniz yoksa belki daha fazla ayrıntıya girebilir misiniz? MEF veya WCF'de hiçbir şekilde ihracat yapıyorum. – Travyguy9

+0

Konuştuğum şeyin bir barebone uygulamasını ekledim. Anahtar, nesne ömrünü yöneten kontrol kabının ters çevrilmesidir. – jason

+0

IIocContainer hangi kurulumda bulunur? – Travyguy9