Esempio n. 1
0
        private static void TestBridgeAndDecoratorAndProxy()
        {
            var officeAddress = EmailAddressFactory.GetOfficeAddress();

            //előre tudom, hogy hidat akarok használni,
            //leválasztom a konkrét megvalósítást a használattól
            //ez az adatok tárolásánál a repository minta

            //EZ HELYETT
            //var repo = new PersonRepository();
            //EZ: Repo példányosítása DI framework-kel
            //https://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx
            //https://ayende.com/blog/2886/building-an-ioc-container-in-15-lines-of-code
            //http://kenegozi.com/blog/2008/01/17/its-my-turn-to-build-an-ioc-container-in-15-minutes-and-33-lines
            //http://blogs.clariusconsulting.net/kzu/funq-screencast-series-on-how-to-building-a-di-container-using-tdd/
            //http://structuremap.github.io/quickstart/

            //amit használunk, az a ninject: http://www.ninject.org/
            var repo = kernel.Get <IPersonRepository>();

            //csak példa, ilyeneket lehet csinálni a repoban, de most nem kell
            //var person = repo.Get(1);
            //var person = repo.Create(person);
            //var person = repo.Delete(person);
            //var person = repo.Update(person);

            var person = repo.GetBirthdayPersons();

            var sendWith = AbstractSendWith.Factory <SendWith>();
            var service  = new EmailService(sendWith);
            //készítünk egy olyan szervizt, ami naplót is készít
            //ezt dekorátor mintával tudjuk megtenni, ha a szerviz kódját nem módosíthatjuk.

            //Akkor működik, ha a függvény, amit dekorálni akarok virtuális VAGY
            //akkor működik, ha a saját felületemet tudom használni
            var serviceWithLogger = new EmailServiceWithLogger(service, sendWith);

            //Ha az eredeti felületet kell használnom, ÉS nem virtuális az eredeti függvény,
            //akkor nem fogja meghívni semmi az én függvényemet, ez így sosem fog naplózni.
            //EmailService serviceWithLogger = new EmailServiceWithLogger(service, sendWith);

            //PROXY minta: ha a proxy osztály felületének a használatát ki lehet kényszeríteni.
            //egyéb nevek: Wrapper/burkoló
            var serviceProxy = new EmailServiceProxy(service, sendWith);

            //A proxy osztályt akkor használjuk, ha például
            // - a fejlesztéskor nem áll rendelkezésre a végleges megvalósítás
            // - hálózaton keresztül kapcsolódunk, és szeretnénk tesztet írni,
            //   - jogosultságot implementálni
            //   - cache-t implementálni.

            //Facade: amikor az eredeti osztály felülete nagyon bonyolult, akkor
            //        egy egyszerű könnyebben felhasználható felületet adunk.
            // Például:
            //       Sok komolyabb workflow-t implementáló WebAPI ad saját kliens könyvtárat.
            //       Például: Paypal fizetés

            var message = EmailMessage.Factory
                          (
                from: officeAddress,
                to: person.EmailAddress,
                subject: "üdvözlet",
                message: "Boldog születésnapot"
                          );

            serviceWithLogger.Send(message);
        }
Esempio n. 2
0
        private static void TestBridgeDecoratorAndProxy()
        {
            var officeAddress = EmailAddressFactory.GetOfficeAddress();

            //Elore tudom, hogy hidat akarok hasznalni,
            //levalasztom a konkret megvalositast a hasznalattol
            //ez az adatok tarolasanal a repository minta

            //E HELYETT
            //var repo = new PersonRepository();

            //EZ LESZ: Repo peldanyositasa DI (Dependency Injection) frameworkkel
            //https://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx

            //Ninject-et hasznalunk: http://www.ninject.org
            var repo = kernel.Get <IPersonRepository>();


            //Ezek csak peldak; ilyeneket lehetne csinalni egy repoban
            //var person = repo.Get(1);
            //var person = repo.Create(person);
            //var person = repo.Delete(person);
            //var person = repo.Update(person);

            var person = repo.GetBirthdayPersons();

            //var sendWith = AbstractSendWith.Factory(SendWithTypes.SendWith); //statikus fgv-t keszitettunk
            var sendWith = AbstractSendWith.Factory <SendWith>();

            var service = new EmailService(sendWith); //Fogadja a strategiat (a Send metodust) es meghivja

            //----------------------------------######## DEKORATOR #######---------------------------------------------------------------------
            //keszitunk egy olyan szervizt, ami naplot is keszit
            //Ha a szerviz kodjat mar valamiert nem modosithatjuk (pl. regi kod kiegeszitese, vagy nem modosithato a forraskod),
            //akkor ezt ######## DEKORATOR ####### mintaval tudjuk megtenni
            //Keszitunk egy burkoloosztalyt, es dependency injection-el atadjuk neki az eredeti osztalyt.

            //Akkor mukodik, ha a EmailServiceWithLogger feluletet tudom hasznalni.
            //Vagy, ha a dekoralando fgv (Send) virtualis, es overridolni tudom a dekorator osztalyban.
            //EmailService serviceWithLogger = new EmailServiceWithLogger(service, sendWith);// --> Igy az ososztaly Send fuggvenyet fogja hivni, ha nincs virt/overr.
            var serviceWithLogger = new EmailServiceWithLogger(service, sendWith);

            //----------------------------------######### PROXY ############---------------------------------------------------------------------
            //A proxy osztaly feluletenek hasznalatat ki lehet kenyszeriteni
            //A Decorator-hoz hasonloan ez is egy wrapper (beburkoljuk es meghivjuk az eredeti osztalyt, es annak mukodeset kiegeszitjuk)
            var serviceWithProxy = new EmailServiceWithProxy(service, sendWith);

            //A proxy osztalyt akkor hasznaljuk, ha pl.:
            // - a fejleszteskor nem all rendelkezesre a vegleges megvalositas
            // - halozaton keresztul kapcsolodunk, es szeretnenk tesztet irni,
            // - jogosultsagot implementalni,
            // - cache-t implementalni

            // ----------------------------------######### FACADE ############---------------------------------------------------------------------
            //Amikor az eredeti osztaly felulete tul bonzolult, akkor helyette egy konnyebben felhasznalhato feluletet adunk. Pl.:
            // - Sok, komolyabb (sok lepesbol allo) workflow-t implementalo WebAPI as sajat klienskonyvtarat. Pl.:
            //        - PayPal fizetes
            //---------------------------------------------------------------------------------------------------------------------------------------
            var message = EmailMessage.Factory(
                officeAddress,
                person.EmailAddress,
                "Udvozlet",
                "Boldog szuletesnapot!");

            //service.Send(message);
            serviceWithLogger.Send(message);
        }