У меня есть архитектура: некоторые сервисы веб-API вставляют данные в SQL таблицы базы данных. А некоторые windows сервисы подписываются на эту таблицу вставки события и выполняют некоторую работу. В. Net Framework Я использую sql зависимость для подписки.
На данный момент у меня есть задача перенести все проекты в ядро. Net. Для веб-API нет вопросов, для сервисов windows я могу использовать шаблон проекта WorkerService. Вопрос в том, как использовать sql зависимость.
In. Net Framework Я использую класс уведомлений
public class EntityChangeNotifier<TEntity> : IDisposable where TEntity : class
{
private DbContext _context;
private Expression<Func<TEntity, bool>> _query;
private string _connectionString;
public EntityChangeNotifier(Expression<Func<TEntity, bool>> query = null)
{
_context = new MyDbContext();
_query = query;
_connectionString = _context.Database.Connection.ConnectionString;
SqlDependency.Start(_connectionString);
RegisterNotification();
}
public event EventHandler<EntityChangeEventArgs<TEntity>> Changed;
public event EventHandler<NotifierErrorEventArgs> Error;
private void RegisterNotification()
{
_context = new GoodWillDbContext();
using (SqlConnection connection = new SqlConnection(_connectionString))
{
using (SqlCommand command = GetCommand())
{
command.Connection = connection;
connection.Open();
var sqlDependency = new SqlDependency(command);
sqlDependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
using (SqlDataReader reader = command.ExecuteReader())
{
}
}
}
}
private DbQuery<TEntity> GetCurrent()
{
IQueryable<TEntity> query = _context.Set<TEntity>();
if (_query != null)
return query.Where(_query) as DbQuery<TEntity>;
return query as DbQuery<TEntity>;
}
private SqlCommand GetCommand()
{
var query = GetCurrent();
SqlCommand command = new SqlCommand()
{
CommandText = query.ToString()
};
return command;
}
protected virtual void OnChanged(EntityChangeEventArgs<TEntity> e)
{
Changed?.Invoke(this, e);
}
protected virtual void OnError(NotifierErrorEventArgs e)
{
Error?.Invoke(this, e);
}
private void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
// Handle dependency change event
// OnChange or OnError event
}
public void Dispose()
{
// stop
}
Но в. Net он выдает ошибки, например, GetCurrent всегда значение NULL. Я понимаю, что невозможно использовать класс для. net framework для. net core. Есть ли способ заставить его работать или лучше подписаться на изменения базы данных.