-
Notifications
You must be signed in to change notification settings - Fork 23
How to convert from SqlTableDependency to SqlTableDependencyProvider
Tomas Fabian edited this page Jan 7, 2021
·
4 revisions
- reconnection in case of lost connections to the same conversation handle (database objects) within timeout period. You shouldn't lost data changes within timeout period. The messages will be delivered after the reconnection.
- end to end pub sub to .NET clients via Redis (Joker.Redis and Joker.MVVM). EntityChangesViewModel synchronizes data changes from SqlTableDependencyProvider (MS SQL Server) and also tries to reconnect (refresh data) in case of lost connection with Redis
- hopefully external dependency bug fix: https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency/issues/188
Install-Package SqlTableDependency.Extensions
using SqlTableDependency.Extensions;
public class ConversionFromSqlTableDependency
{
public void SqlTableDependencyExample(string connectionString)
{
var mapper = new ModelToTableMapper<Product>();
mapper.AddMapping(c => c.Id, "Id");
mapper.AddMapping(c => c.Name, "Name");
using (var sqlTableDependency = new SqlTableDependency<Product>(connectionString, "Products", mapper: mapper, includeOldValues: true))
{
sqlTableDependency.OnChanged += OnChanged;
sqlTableDependency.OnError += OnError;
sqlTableDependency.OnStatusChanged += OnStatusChanged;
sqlTableDependency.Start();
Console.ReadKey();
sqlTableDependency.OnChanged -= OnChanged;
sqlTableDependency.OnError -= OnError;
sqlTableDependency.OnStatusChanged -= OnStatusChanged;
}
}
private static void OnError(object sender, ErrorEventArgs e)
{
Console.WriteLine($"SqlTableDependency error {e.Error}");
}
private static void OnStatusChanged(object sender, StatusChangedEventArgs e)
{
Console.WriteLine($"SqlTableDependency Status {e.Status}");
}
private static void OnChanged(object sender, RecordChangedEventArgs<Product> e)
{
if (e.ChangeType == ChangeType.Update)
{
Console.WriteLine("Id: " + e.Entity.Id);
Console.WriteLine("Name: " + e.Entity.Name);
if(e.EntityOldValues != null)
{
Console.WriteLine(Environment.NewLine);
var changedEntity = e.EntityOldValues;
Console.WriteLine("Id (OLD): " + changedEntity.Id);
Console.WriteLine("Name (OLD): " + changedEntity.Name);
}
}
}
}
SqlTableDependencyProvider equivalents:
internal class ProductsSqlTableDependencyProvider2 : SqlTableDependencyProvider<Product>
{
internal ProductsSqlTableDependencyProvider2(string connectionString, IScheduler scheduler, LifetimeScope lifetimeScope = LifetimeScope.UniqueScope)
: base(connectionString, scheduler, lifetimeScope)
{
}
protected override string TableName => base.TableName+"s";
protected override SqlTableDependencySettings<Product> OnCreateSettings()
{
var settings = base.OnCreateSettings();
settings.IncludeOldValues = true;
return settings;
}
protected override ModelToTableMapper<Product> OnInitializeMapper(ModelToTableMapper<Product> modelToTableMapper)
{
modelToTableMapper.AddMapping(c => c.Id, "Id");
modelToTableMapper.AddMapping(c => c.Name, "Name");
return modelToTableMapper;
}
protected override void OnError(Exception error)
{
Console.WriteLine($"SqlTableDependency error {error}");
}
protected override void SqlTableDependencyOnStatusChanged(object sender, StatusChangedEventArgs e)
{
Console.WriteLine($"SqlTableDependency Status {e.Status}");
}
protected override void OnUpdated(Product entity, Product oldValues)
{
Console.WriteLine("Id: " + entity.Id);
Console.WriteLine("Name: " + entity.Name);
if (oldValues != null)
{
Console.WriteLine(Environment.NewLine);
Console.WriteLine("Id (OLD): " + oldValues.Id);
Console.WriteLine("Name (OLD): " + oldValues.Name);
}
}
public static void Example(string connectionString)
{
using (var sqlTableDependency = new ProductsSqlTableDependencyProvider2(connectionString, ThreadPoolScheduler.Instance))
{
sqlTableDependency.SubscribeToEntityChanges();
Console.ReadKey();
}
}
}
More reactive style:
internal class ProductsSqlTableDependencyReactiveProvider : SqlTableDependencyProvider<Product>
{
internal ProductsSqlTableDependencyReactiveProvider(string connectionString, IScheduler scheduler, LifetimeScope lifetimeScope = LifetimeScope.UniqueScope)
: base(connectionString, scheduler, lifetimeScope)
{
}
protected override string TableName => base.TableName+"s";
protected override SqlTableDependencySettings<Product> OnCreateSettings()
{
var settings = base.OnCreateSettings();
settings.IncludeOldValues = true;
return settings;
}
protected override ModelToTableMapper<Product> OnInitializeMapper(ModelToTableMapper<Product> modelToTableMapper)
{
modelToTableMapper.AddMapping(c => c.Id, "Id");
modelToTableMapper.AddMapping(c => c.Name, "Name");
return modelToTableMapper;
}
protected override void OnError(Exception error)
{
Console.WriteLine($"SqlTableDependency error {error}");
}
public static void Example(string connectionString)
{
using (var sqlTableDependency = new ProductsSqlTableDependencyProvider2(connectionString, ThreadPoolScheduler.Instance))
{
IDisposable whenEntityRecordChangesSubscription =
sqlTableDependency.WhenEntityRecordChanges
.Where(c => c.ChangeType == ChangeType.Update)
.Subscribe(c =>
{
var entity = c.Entity;
Console.WriteLine("Id: " + entity.Id);
Console.WriteLine("Name: " + entity.Name);
var oldValues = c.EntityOldValues;
if (oldValues != null)
{
Console.WriteLine(Environment.NewLine);
Console.WriteLine("Id (OLD): " + oldValues.Id);
Console.WriteLine("Name (OLD): " + oldValues.Name);
}
});
IDisposable whenStatusChangesSubscription =
sqlTableDependency.WhenStatusChanges
.Subscribe(status =>
{
Console.WriteLine($"SqlTableDependency Status {status}");
});
sqlTableDependency.SubscribeToEntityChanges();
Console.ReadKey();
whenEntityRecordChangesSubscription.Dispose();
whenStatusChangesSubscription.Dispose();
}
}
}