private static void EventProxyDemonstration() { Console.WriteLine(nameof(EventProxyDemonstration)); var proxyBuilder = new ReflectionProxyBuilder <IInputDetector>(); proxyBuilder.SetEventProxy <UserInputEventArgs>((id, h) => id.OnInputAvailable += new EventHandler <UserInputEventArgs>(h), (h, o, a) => { if (a.Input.Length >= 5) { h.Invoke(o, a); } }); var inputDetector = new InputDetector(); var proxiedInstance = proxyBuilder.Build(inputDetector); proxiedInstance.OnInputAvailable += (o, a) => Console.WriteLine($"Input from user: {a.Input}"); inputDetector.RaiseInputAvailable("U"); inputDetector.RaiseInputAvailable("US"); inputDetector.RaiseInputAvailable("USER"); inputDetector.RaiseInputAvailable("USER "); inputDetector.RaiseInputAvailable("USER I"); inputDetector.RaiseInputAvailable("USER IN"); inputDetector.RaiseInputAvailable("USER INP"); inputDetector.RaiseInputAvailable("USER INPU"); inputDetector.RaiseInputAvailable("USER INPUT"); Console.WriteLine(); }
private static void IndexerProxySelfFillingMap() { Console.WriteLine(nameof(IndexerProxySelfFillingMap)); var index = 0; var dictionary = new Dictionary <char, int>(); var proxyBuilder = new ReflectionProxyBuilder <IDictionary <char, int> >(); proxyBuilder.SetIndexerGetterProxy <char, int>((d, c) => d[c], (d, c) => { if (!dictionary.ContainsKey(c)) { dictionary[c] = index++; } return(d.Invoke(c)); }); var proxiedInstance = proxyBuilder.Build(dictionary); Console.WriteLine($"Context A value {proxiedInstance['A']}"); Console.WriteLine($"Context B value {proxiedInstance['B']}"); Console.WriteLine($"Context C value {proxiedInstance['C']}"); Console.WriteLine($"Context B value {proxiedInstance['B']}"); Console.WriteLine($"Context D value {proxiedInstance['D']}"); Console.WriteLine($"Context A value {proxiedInstance['A']}"); Console.WriteLine($"Context E value {proxiedInstance['E']}"); Console.WriteLine(); }
private static void ProxyDemonstrationArgumentLimiter() { Console.WriteLine(nameof(ProxyDemonstrationArgumentLimiter)); var proxyBuilder = new ReflectionProxyBuilder <IConnection>(); proxyBuilder.SetActionProxy <byte[]>(c => c.SendData, (c, d) => { for (int i = 0; i < (d.Length / 10); i++) { c.Invoke(d.Skip(i * 10).Take(10).ToArray()); } c.Invoke(d.Skip((d.Length / 10) * 10).Take(d.Length - (d.Length / 10) * 10).ToArray()); }); var proxiedInstance = proxyBuilder.Build(new Connection()); proxiedInstance.SendData(new byte[9]); proxiedInstance.SendData(new byte[12]); proxiedInstance.SendData(new byte[15]); proxiedInstance.SendData(new byte[38]); Console.WriteLine(); }
private static void PairDecoratorsDemonstrationOnException() { Console.WriteLine(nameof(PairDecoratorsDemonstrationOnException)); var synchronization = new object(); var proxyBuilder = new ReflectionProxyBuilder <IDbRepository>(); proxyBuilder.AddPairActionDecorators(dbr => dbr.CommitChanges, () => { Monitor.Enter(synchronization); Console.WriteLine("Locked"); }, () => { Monitor.Exit(synchronization); Console.WriteLine("Unlocked"); }); var decoratedInstance = proxyBuilder.Build(new DbRepositoryThrowingException()); try { decoratedInstance.CommitChanges(); } catch (Exception ex) { Console.WriteLine($"Catched exception: {ex.Message}"); } Console.WriteLine(); }
private static void AfterDecoratorDemostration() { Console.WriteLine(nameof(AfterDecoratorDemostration)); var proxyBuilder = new ReflectionProxyBuilder <IDbRepository>(); proxyBuilder.AddAfterActionDecorator(dbr => dbr.CommitChanges, () => { Console.WriteLine("Clear connection"); }); var decoratedInstance = proxyBuilder.Build(new DbRepository()); decoratedInstance.CommitChanges(); Console.WriteLine(); }
private static void PairDecoratorsDemonstration() { Console.WriteLine(nameof(PairDecoratorsDemonstration)); var stopwatch = new Stopwatch(); var proxyBuilder = new ReflectionProxyBuilder <IDbRepository>(); proxyBuilder.AddPairActionDecorators(dbr => dbr.CommitChanges, () => { stopwatch.Start(); }, () => { stopwatch.Stop(); Console.WriteLine($"Commit changes took '{stopwatch.ElapsedMilliseconds}' ms"); }); var decoratedInstance = proxyBuilder.Build(new DbRepositoryWithSleep()); decoratedInstance.CommitChanges(); Console.WriteLine(); }
private static void ProxyDemonstrationNullGuard() { Console.WriteLine(nameof(ProxyDemonstrationNullGuard)); var proxyBuilder = new ReflectionProxyBuilder <IConnection>(); proxyBuilder.SetActionProxy <byte[]>(c => c.SendData, (f, d) => { if (d != null) { f.Invoke(d); } }); var proxiedInstance = proxyBuilder.Build(new Connection()); proxiedInstance.SendData(null); proxiedInstance.SendData(new byte[10]); proxiedInstance.SendData(null); proxiedInstance.SendData(new byte[20]); Console.WriteLine(); }