public async Task Raise(IPayload payload) { var handlers = config.Container .Resolve <IEventHolder>() .GetHandlers(payload); foreach (var handler in handlers) { using (var scope = config.Scope()) { scope.Register(payload.Data.GetType()) .ImplementedBy(c => payload.Data) .As <Singleton>(); var container = scope.Container; var instanse = container.Resolve(handler); var @event = container.Resolve(payload.Event); await((Task)handler.InvokeMember( "Execute", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, instanse, new[] { @event })).ConfigureAwait(false); } } }
public async Task Run() { var rootContainer = config.Container; var configuration = rootContainer.Resolve <IConfiguration>(); var tcpListener = new TcpListener(new IPEndPoint(IPAddress.Parse(configuration.Host), configuration.Port)); tcpListener.Start(); while (true) { var tcpClient = await tcpListener.AcceptTcpClientAsync().ConfigureAwait(false); tcpClient.NoDelay = true; tcpClient.ReceiveTimeout = 0; tcpClient.SendTimeout = 0; tcpClient.ReceiveBufferSize = 256; tcpClient.SendBufferSize = 256; using (var scope = config.Scope()) { scope.Register <IContainerConfig>() .ImplementedBy(c => scope) .As <Singleton>(); var container = scope.Container; scope.Register <IContainer>() .ImplementedBy(c => container) .As <Singleton>(); scope.Register <TcpClient>() .ImplementedBy(c => tcpClient) .As <Singleton>(); var connection = container.Resolve <IConnection>(); scope.Register <IConnection>() .ImplementedBy(c => connection) .As <Singleton>(); } } }
protected NodeConfig() { rootConfig.Register <ISerializer>() .ImplementedBy <Serializer>() .As <Singleton>(); rootConfig.Register <ICompression>() .ImplementedBy <Compression>() .As <Singleton>(); rootConfig.Register <IEncryption>() .ImplementedBy <Encryption>() .As <Singleton>(); rootConfig.Register <IConnection>() .ImplementedBy <Connection>() .As <Transient>(); rootConfig.Register <EventCollection>() .ImplementedBy <EventCollection>() .As <Singleton>(); rootConfig.Register <HandlerCollection>() .ImplementedBy <HandlerCollection>() .As <Singleton>(); rootConfig.Register <IEventHolder>() .ImplementedBy <EventHolder>() .As <Singleton>(); rootConfig.Register <Disconnect>(); rootConfig.Register <Error>(); Config = rootConfig.Scope(); Config.Register <IContainerConfig>() .ImplementedBy(c => Config) .As <Singleton>(); }