Я пытаюсь создать метод для прослушивания потока с сервера Redis и возврата списка записей потока в зависимости от текущего типа потока. Для этого я создал простой абстрактный базовый класс со свойствами, которые я ожидаю от всех типов потоковых записей
Код: Выделить всё
public abstract class RedisStreamEntryDto
{
public required float Progress { get; set; }
public required bool RunDone { get; set; }
}
Код: Выделить всё
public class RedisUtils(ConnectionMultiplexer redis)
{
public async Task GetStreamEntriesAsync(string streamName):
{
var db = redis.GetDatabase();
bool stopListening = false;
List streamItems = [];
while (!stopListening)
{
StreamEntry[] streamEntries = await db.StreamReadAsync(streamName, "0-0");
foreach (var entry in streamEntries)
{
if(entry.IsNull)
{
continue;
}
var add_entry = // how to instantiate?
streamItems.Add(add_entry);
if (add_entry.RunDone)
{
stopListening = true;
break;
}
}
}
return streamItems;
}
}
Подход
Идея заключалась в том, чтобы просто заставить все классы, которые наследуются от RedisStreamEntryDto, реализовать статический метод FromStreamEntry(StreamEntry write), который возвращает правильный экземпляр. Я застрял в том, как реализовать это в базовом классе, чтобы иметь возможность его использовать. Абстрактные статические методы невозможны, я также уже пытался использовать интерфейс вместо абстрактного класса, но это в основном приводит к той же проблеме.
Единственное решение, которое я могу придумать, - это создать отдельный фабричный класс , что немного раздражает в этой «простой» проблеме. Неужели нет лучшего решения?
Подробнее здесь: https://stackoverflow.com/questions/784 ... in-c-sharp