wcf服务初始化

wcf服务初始化,wcf,parameters,constructor,Wcf,Parameters,Constructor,我有一个简单地包装组件方法的服务。 我以编程方式创建服务,并且需要使用组件对其进行初始化(在构造函数中作为参数传入、have setter方法或任何方式)。我的服务在windows服务中自托管。我读过IInstanceProvider和ServiceHost aproach,但我认为这可能更多地用于DI容器,我需要做的应该简单得多。 如有任何建议,将不胜感激。以下是我的示例代码: 以编程方式创建服务: _plcServiceHost = new ServiceHost(typeof(PLCSer

我有一个简单地包装组件方法的服务。 我以编程方式创建服务,并且需要使用组件对其进行初始化(在构造函数中作为参数传入、have setter方法或任何方式)。我的服务在windows服务中自托管。我读过IInstanceProvider和ServiceHost aproach,但我认为这可能更多地用于DI容器,我需要做的应该简单得多。 如有任何建议,将不胜感激。以下是我的示例代码:

  • 以编程方式创建服务:

    _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。带设定器的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();
            }
    

    您可以使用前面提到的DI(如Unity、Castle等)从服务外部初始化实现

    这样,您就可以在
    PLCService
    构造函数中使用它