У меня есть концентратор SignalR, который прослушивает запросы клиентов и использует Rx.NET для наблюдения за таблицей базы данных, чтобы отправлять обновления запрашивающему их клиенту, как только они становятся доступными. Но похоже, что экземпляр Observer
, созданный в хабе по запросу клиента, уничтожается (GC?) сразу после завершения вызова метода; поэтому я не получаю обновлений.
Это моя текущая реализация Hub
:
public class BookHub : Hub {
private readonly BookService _service = new BookService();
public void RequestBookUpdate(string author) {
BookObserver observer = new BookObserver(Context.connectionId);
IDisposable unsubscriber = _service.RequestBookUpdate(author, observer);
}
}
BookService
возвращает запрос LINQ, преобразованный в Observable
:
public IDisposable RequestBookUpdate(string author, BookObserver observer) {
var query = from b in db.Book where b.Author.Contains(author) select b;
IObservable<Book> observable = query.ToObservable();
IDisposable unsubscriber = observable.Subscribe(observer);
return unsubscriber;
}
BookObserver
просто отправляет новые извлеченные элементы конкретному клиенту, запросившему обновления (идентифицированному connectionId
):
// omissis
private static readonly IHubContext _context = GlobalHost.ConnectionManager.GetHubContext<BookHub>();
private readonly string _connectionId;
public BookObserver(string connectionId) {
connectionId = _connectionId:
}
public void OnNext(Book value) {
_context.Clients.Client(_connectionId).foundNewBook(value);
}
Меня не волнует уничтожение экземпляра BookService
, но я хочу, чтобы экземпляр BookObserver
оставался в живых, поэтому я могу вызывать unsubscriber.Dispose()
только тогда, когда клиент отключается. Это возможно?
IQueryable
с помощью Rx.NET и отправка обновления через WebSocket. - person frapontillo   schedule 15.04.2014db
, похоже, не поддерживает эту функцию. - person cwharris   schedule 15.04.2014db
? (Какой тип базы данных вы используете) - person cwharris   schedule 15.04.2014db
— этоDbContext
, в настоящее время использующий версию 4 Entity Framework. Экземпляр базы данных — Microsoft SQL Server 2012. - person frapontillo   schedule 15.04.2014db
? Если экземпляр db удаляется, его потребители запросов также будут очищены (или завершатся ошибкой). - person cwharris   schedule 15.04.2014db
привязан только кBookService
, который создает его с помощьюMyDatabaseEntities db = new MyDatabaseEntities();
. Конечно,MyDatabasEntities
автоматически создается Entity Framework и расширяетDbContext
. - person frapontillo   schedule 15.04.2014.ToObservable()
превратит один запрос к базе данных в нечто, которое будет повторно запрашивать базу данных для изменений. Это не так. Вам нужно создать запрос на основеObservable.Interval
и сделать повторные вызовы базы данных самостоятельно, чтобы получить новые записи, а затем вернуть их. Ваша наблюдаемая подпись должна иметь видIObservable<IEnumerable<Book>>
, так как каждый вызов базы данных будет возвращать ноль или более книг. - person Enigmativity   schedule 16.04.2014OnChangeObservable
иSqlCommand
. Кто-нибудь когда-нибудь использовал его? - person frapontillo   schedule 18.04.2014