Beispiel #1
0
        private void AddWithSqlDependency(string key, TValue item, SqlCacheDependency sqlDependency)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            if (sqlDependency == null)
            {
                throw new ArgumentNullException(nameof(sqlDependency));
            }

            _Cache.SetObject(key, new CacheItem <TValue>()
            {
                AbsoluteExpiration = DateTime.MinValue,
                SlidingExpiration  = TimeSpan.Zero,
                Item = item
            });

            Policy.Handle <Exception>()
            .RetryForever()
            .Execute(() =>
            {
                // subscribe to sql dependency
                _channel = new ChangeTrackingChannelHelper((ISqlChangeCallback)this).OpenChannel();
                _channel.Subscribe(key, sqlDependency.TableName);
            }
                     );

            // subscribe client for callback
            SubscribeCallback(key, sqlDependency.Callback);
        }
        public override void OnStart()
        {
            // Will be called the first time windows service is started!
            Tasks = new List <Task>();

            // Configure the DI and dependencies and intitialize the Manager
            Logger.Information("OnStart [S]" + DateTime.Now);
            var container = ConfigureDependency.Configure();

            SimpleInjectorServiceHostFactory.SetContainer(container);


            Logger.Information("Configuring dependencies");
            var changeTrackingManager = container.GetInstance <ISqlTrackingManager>();

            changeTrackingManager.logger = this.Logger;

            Logger.Information("Initialsing the change tracking manager!");
            cancellationTokenSource = new CancellationTokenSource();
            Tasks.Add(changeTrackingManager.ProcessChangedTables(cancellationTokenSource.Token));

            // Initialise wcf service host
            // Wcf Service Instance
            _WcfService = container.GetInstance <IChangeTrackingSubscriptions>();

            _WcfService.Logger = this.Logger;
            _ServiceHost       = WcfServiceHost.GetServiceHost(_WcfService);

            Logger.Information("OnStart [E]" + DateTime.Now);
        }
        public IChangeTrackingSubscriptions OpenChannel()
        {
            var callbackCleint = new CallbackCleint(Callback);

            var client =
                new DuplexChannelFactoryClient <IChangeTrackingSubscriptions, IEventNotificationCallback>
                    (callbackCleint, ServiceUrl.SqlTrackingWcfServiceAddress);

            _channel = client.CreateChannel();
            ((ICommunicationObject)_channel).Closed  += Channel_Closed;
            ((ICommunicationObject)_channel).Faulted += Channel_Faulted;

            return(_channel);
        }
Beispiel #4
0
        public static ServiceHost GetServiceHost(IChangeTrackingSubscriptions service)
        {
            if (_ServiceHost != null)
            {
                _ServiceHost.Close();
            }

            Uri[] adrbase = { new Uri(tcpBaseAddress) };

            // initialize the WCF service using DI and inject it into hose
            _ServiceHost = new ServiceHost(service, adrbase);
            // NB: important be able to inject service instance above
            ((ServiceBehaviorAttribute)_ServiceHost.Description.Behaviors[typeof(ServiceBehaviorAttribute)]).InstanceContextMode = InstanceContextMode.Single;

            ServiceMetadataBehavior serviceBehaviour = new ServiceMetadataBehavior();

            if (!_ServiceHost.Description.Behaviors.Contains(serviceBehaviour))
            {
                _ServiceHost.Description.Behaviors.Add(serviceBehaviour);
            }

            NetTcpBinding tcpBinding = new NetTcpBinding();

            // NB: important to keep the duplex session open for long, though should be some reasonable number?
            tcpBinding.OpenTimeout    = TimeSpan.MaxValue;
            tcpBinding.CloseTimeout   = TimeSpan.MaxValue;
            tcpBinding.ReceiveTimeout = TimeSpan.MaxValue;

            _ServiceHost.AddServiceEndpoint(typeof(IChangeTrackingSubscriptions), tcpBinding, tcpBaseAddress);
            _ServiceHost.AddServiceEndpoint(typeof(IMetadataExchange),
                                            MetadataExchangeBindings.CreateMexTcpBinding(), "mex");

            _ServiceHost.Open();

            return(_ServiceHost);
        }
Beispiel #5
0
 public SqlTrackingManager(IDatabaseHelper databaseHelper, IChangeTrackingSubscriptions wcfService)
 {
     DatabaseHelper = databaseHelper;
     WcfService     = wcfService;
 }