2013-04-16 76 views
0

我有一个简单的包装组件方法的服务。 我以编程方式创建服务,我需要用组件初始化它(要么作为参数传递给构造函数,要么使用setter方法,要么传入任何方式)。我的服务是在Windows服务中自行托管的。我阅读了IInstanceProvider和ServiceHost的aproach,但我认为这可能更多地用于DI容器,我需要做的事情应该更简单。 任何意见,将不胜感激。这里是我的示例代码:wcf服务初始化

  1. 编程方式创建服务:

    _plcServiceHost = new ServiceHost(typeof(PLCService)); 
    
    
        foreach (var plc in PLCRepository.GetAllLocal()) 
        { 
         var baseAddress = plc.LocalEndpointName; 
    
         var binding = new NetTcpBinding(); 
    
         _plcServiceHost.AddServiceEndpoint(typeof(IPLCService), binding, baseAddress); 
    
    
         AddMetadataExchange(_plcServiceHost, baseAddress); 
        } 
    
    _plcServiceHost.Open(); 
    

这是我想怎么有我的服务(2a或2b)。 2a。使用setter的PLC服务:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
    public class PLCService : IPLCService 
    { 
     #region fields 
     public static volatile object HardwareLock = new object(); 
     private IPLCImpl _plc; 
     private Semaphore _unsubscribeSem; 
     private bool _isSubscribed; 

     #endregion 

     public void SetPLC(IPLCImpl plc) 
     { 
      if (plc == null) throw new ArgumentNullException("plc"); 

      _plc = plc; 

      _plc.Connect(); 
     } 

2b。 PLC服务与构造函数初始化:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
    public class PLCService : IPLCService 
    { 
     #region fields 
     public static volatile object HardwareLock = new object(); 
     private readonly IPLCImpl _plc; 
     private Semaphore _unsubscribeSem; 
     private bool _isSubscribed; 

     #endregion 

     public PLCService(IPLCImpl plc) 
     { 
      if (plc == null) throw new ArgumentNullException("plc"); 

      _plc = plc; 

      _plc.Connect(); 
     } 

回答

0

您可以初始化从服务外的实现,采用提到DI一样团结,城堡,等等。

以这种方式,您可以在PLCService构造函数中使用它。