コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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();
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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();
        }
コード例 #6
0
        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();
        }
コード例 #7
0
        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();
        }