मैं एक समांतर घटना ग्राहक बनाने की कोशिश कर रहा हूं। यह मेरा पहला प्रयास है:समांतर घटना ग्राहक .net 4.5
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using EventStore.ClientAPI;
namespace Sandbox
{
public class SomeEventSubscriber
{
private Position? _latestPosition;
private readonly Dictionary<Type, Action<object>> _eventHandlerMapping;
private IEventStoreConnection _connection;
public Dictionary<Type, Action<object>> EventHandlerMapping
{
get { return _eventHandlerMapping; }
}
public SomeEventSubscriber()
{
_eventHandlerMapping = CreateEventHandlerMapping();
_latestPosition = Position.Start;
}
public void Start()
{
ConnectToEventstore();
}
private void ConnectToEventstore()
{
_connection = EventStoreConnectionWrapper.Connect();
_connection.Connected +=
(sender, args) => _connection.SubscribeToAllFrom(_latestPosition, false, EventOccured, LiveProcessingStarted, HandleSubscriptionDropped);
}
private Dictionary<Type, Action<object>> CreateEventHandlerMapping()
{
return new Dictionary<Type, Action<object>>
{
{typeof (FakeEvent1), o => Handle(o as FakeEvent1)},
{typeof (FakeEvent2), o => Handle(o as FakeEvent2)},
};
}
private async Task Handle(FakeEvent1 eventToHandle)
{
SomethingLongRunning(eventToHandle);
}
private async Task Handle(FakeEvent2 eventToHandle)
{
SomethingLongRunning(eventToHandle);
}
private async Task SomethingLongRunning(BaseFakeEvent eventToHandle)
{
Console.WriteLine("Start Handling: " + eventToHandle.GetType());
var task = Task.Delay(10000);
await task;
Console.WriteLine("Finished Handling: " + eventToHandle.GetType());
}
private void EventOccured(EventStoreCatchUpSubscription eventStoreCatchUpSubscription,
ResolvedEvent resolvedEvent)
{
if (resolvedEvent.OriginalEvent.EventType.StartsWith("$") || resolvedEvent.OriginalEvent.EventStreamId.StartsWith("$"))
return;
var @event = EventSerialization.DeserializeEvent(resolvedEvent.OriginalEvent);
if (@event != null)
{
var eventType = @event.GetType();
if (_eventHandlerMapping.ContainsKey(eventType))
{
var task = Task.Factory.StartNew(() => _eventHandlerMapping[eventType](event));
Console.WriteLine("The task is running asynchronously...");
}
}
if (resolvedEvent.OriginalPosition != null) _latestPosition = resolvedEvent.OriginalPosition.Value;
}
private void HandleSubscriptionDropped(EventStoreCatchUpSubscription subscription, SubscriptionDropReason dropReason, Exception ex)
{
if (dropReason == SubscriptionDropReason.ProcessingQueueOverflow)
{
//TODO: Wait and reconnect probably with back off
}
if (dropReason == SubscriptionDropReason.UserInitiated)
return;
if (SubscriptionDropMayBeRecoverable(dropReason))
{
Start();
}
}
private static bool SubscriptionDropMayBeRecoverable(SubscriptionDropReason dropReason)
{
return dropReason == SubscriptionDropReason.Unknown || dropReason == SubscriptionDropReason.SubscribingError ||
dropReason == SubscriptionDropReason.ServerError || dropReason == SubscriptionDropReason.ConnectionClosed;
}
private static void LiveProcessingStarted(EventStoreCatchUpSubscription eventStoreCatchUpSubscription)
{
}
}
}
अपने विशेषज्ञ राय में, यह एक वैध दृष्टिकोण है? क्या आप किसी भी सुधार का सुझाव दे सकते हैं?
पुनश्च:
शायद:
Task.Run(() => _eventHandlerMapping[eventType](@event));
बेहतर होगा?
मैंने पूरी समीक्षा नहीं की, लेकिन मेरी पहली आलोचना "@event" नामक चर से बचने के लिए होगी। यहां तक कि यह @ उपसर्ग के साथ पूरी तरह से कानूनी है, यह बदसूरत है। केवल डेटासेट (डीबी, डब्ल्यूएस ...) के खिलाफ जेनरेट कोड के लिए उदाहरण के लिए उपयोगी, "नियमित" कोड में नहीं। मुझे पता है, यह मुख्य विषय से संबंधित वास्तव में सहायक नहीं है, क्षमा करें। – AFract
.NET 5 जैसी कोई चीज़ नहीं है। वर्तमान संस्करण .NET 4.5.2 है, और आगामी संस्करण (विजुअल स्टूडियो 2015) .NET 4.6 है। क्या आप .NET संस्करण संख्या और सी # संस्करणों को भ्रमित कर रहे हैं? –
हां, यही मेरा मतलब था - क्षमा करें। – cs0815