From c9c0768882b917685d1bda2d558bcd6a3ac88c87 Mon Sep 17 00:00:00 2001 From: Martin Dybal Date: Mon, 16 Apr 2018 14:23:21 +0200 Subject: [PATCH] Add materials for extended lecture - design patterns --- .../UserManagement/UserManagement.sln | 25 ++++++++ .../Factory/NewsletterFactory.cs | 15 +++++ .../UserManagement/Models/Contact.cs | 18 ++++++ .../UserManagement/Models/Email.cs | 14 +++++ .../UserManagement/UserManagement/Program.cs | 35 +++++++++++ .../UserManagement/Services/EmailService.cs | 14 +++++ .../UserManagement/UserManagement.csproj | 8 +++ .../UserManagement/UserManagement.sln | 25 ++++++++ .../Composite/ContactComponent.cs | 16 +++++ .../Composite/ContactGroupComposite.cs | 12 ++++ .../Composite/IContactComponent.cs | 9 +++ .../Decorator/LoggedEmailService.cs | 42 +++++++++++++ .../Decorator/LoggingInterceptor.cs | 33 +++++++++++ .../Factory/NewsletterFactory.cs | 15 +++++ .../UserManagement/Models/Email.cs | 14 +++++ .../UserManagement/UserManagement/Program.cs | 38 ++++++++++++ .../UserManagement/Services/EmailService.cs | 14 +++++ .../UserManagement/Services/IEmailService.cs | 9 +++ .../Singleton/EmployeeStorage.cs | 59 +++++++++++++++++++ .../Singleton/IEmployeeStorage.cs | 13 ++++ .../UserManagement/UserManagement.csproj | 12 ++++ .../UserManagement/UserManagementApp.cs | 34 +++++++++++ .../Visitor/Advanced/DisplayUserVisitor.cs | 38 ++++++++++++ .../Visitor/Advanced/SendMailUserVisitor.cs | 37 ++++++++++++ .../Visitor/Advanced/UserVisitorBase.cs | 25 ++++++++ .../Visitor/DisplayUserVisitor.cs | 50 ++++++++++++++++ .../Visitor/SendMailUserVisitor.cs | 47 +++++++++++++++ 27 files changed, 671 insertions(+) create mode 100644 Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement.sln create mode 100644 Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Factory/NewsletterFactory.cs create mode 100644 Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Models/Contact.cs create mode 100644 Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Models/Email.cs create mode 100644 Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Program.cs create mode 100644 Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Services/EmailService.cs create mode 100644 Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/UserManagement.csproj create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement.sln create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/ContactComponent.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/ContactGroupComposite.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/IContactComponent.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Decorator/LoggedEmailService.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Decorator/LoggingInterceptor.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Factory/NewsletterFactory.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Models/Email.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Program.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Services/EmailService.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Services/IEmailService.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Singleton/EmployeeStorage.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Singleton/IEmployeeStorage.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/UserManagement.csproj create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/UserManagementApp.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/DisplayUserVisitor.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/SendMailUserVisitor.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/UserVisitorBase.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/DisplayUserVisitor.cs create mode 100644 Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/SendMailUserVisitor.cs diff --git a/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement.sln b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement.sln new file mode 100644 index 00000000..510c2728 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27428.2015 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserManagement", "UserManagement\UserManagement.csproj", "{CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A78F91F4-F6FA-4CBA-8F85-6091145EE4F7} + EndGlobalSection +EndGlobal diff --git a/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Factory/NewsletterFactory.cs b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Factory/NewsletterFactory.cs new file mode 100644 index 00000000..6421e44e --- /dev/null +++ b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Factory/NewsletterFactory.cs @@ -0,0 +1,15 @@ +using UserManagement.Models; + +namespace UserManagement.Factory +{ + public class NewsletterFactory + { + public Email CreateNewsletter() + { + string subject = "Máme pro vás jedinečnou nabídku!"; + string body = "Začněte používat návrhové vzory právě teď!"; + + return new Email(subject, body); + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Models/Contact.cs b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Models/Contact.cs new file mode 100644 index 00000000..316e942c --- /dev/null +++ b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Models/Contact.cs @@ -0,0 +1,18 @@ +using UserManagement.Services; + +namespace UserManagement.Models +{ + public class Contact + { + public string Firstname { get; set; } + public string Lastname { get; set; } + public string Name => $"{Firstname} {Lastname}"; + public string EmailAddress { get; set; } + + public void SendMail(Email email) + { + var emailService = new EmailService(); + emailService.SendEmail(EmailAddress, email); + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Models/Email.cs b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Models/Email.cs new file mode 100644 index 00000000..305b3909 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Models/Email.cs @@ -0,0 +1,14 @@ +namespace UserManagement.Models +{ + public struct Email + { + public string Subject { get; } + public string Body { get; } + + public Email(string subject, string body) + { + Subject = subject; + Body = body; + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Program.cs b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Program.cs new file mode 100644 index 00000000..e154f778 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Program.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using UserManagement.Factory; +using UserManagement.Models; + +namespace UserManagement +{ + class Program + { + static void Main(string[] args) + { + var contacts = new List() + { + new Contact { Firstname = "Roman", EmailAddress = "roman@super-company.com" }, + new Contact { Firstname = "Tibor", EmailAddress = "tibor@super-company.com" }, + new Contact { Firstname = "Martin", EmailAddress = "martin@super-company.com" }, + new Contact { Firstname = "Adam", EmailAddress = "adam@super-company.com" }, + new Contact { Firstname = "Joe", EmailAddress = "joe@super-company.com" }, + new Contact { Firstname = "Jake", EmailAddress = "jake@super-company.com" }, + new Contact { Firstname = "Emily", EmailAddress = "emily@super-company.com" }, + new Contact { Firstname = "Sophia", EmailAddress = "sophia@super-company.com" }, + new Contact { Firstname = "Brian", EmailAddress = "brian@super-company.com" }, + new Contact { Firstname = "Bob", EmailAddress = "bob@super-company.com" }, + }; + + var newsletterFactory = new NewsletterFactory(); + var newsletter = newsletterFactory.CreateNewsletter(); + + foreach (var contact in contacts) + { + contact.SendMail(newsletter); + } + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Services/EmailService.cs b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Services/EmailService.cs new file mode 100644 index 00000000..bc5b168a --- /dev/null +++ b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/Services/EmailService.cs @@ -0,0 +1,14 @@ +using System; +using UserManagement.Models; + +namespace UserManagement.Services +{ + public class EmailService + { + public void SendEmail(string to, Email email) + { + Console.WriteLine($"Send email to: {to}"); + Console.WriteLine($"\t{email.Subject} - {email.Body}"); + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/UserManagement.csproj b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/UserManagement.csproj new file mode 100644 index 00000000..ce1697ae --- /dev/null +++ b/Lectures/Extended_02/UserManagement-after/UserManagement/UserManagement/UserManagement.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp2.0 + + + diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement.sln b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement.sln new file mode 100644 index 00000000..510c2728 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27428.2015 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserManagement", "UserManagement\UserManagement.csproj", "{CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC18FE27-A64C-4C4E-909A-FDE4B52BE7EC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A78F91F4-F6FA-4CBA-8F85-6091145EE4F7} + EndGlobalSection +EndGlobal diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/ContactComponent.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/ContactComponent.cs new file mode 100644 index 00000000..0fb531be --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/ContactComponent.cs @@ -0,0 +1,16 @@ +using UserManagement.Models; +using UserManagement.Services; + +namespace UserManagement.Composite +{ + public class ContactComponent : IContactComponent + { + private readonly IEmailService emailService; + + public string Firstname { get; set; } + public string Lastname { get; set; } + + public string Name => $"{Firstname} {Lastname}"; + public string EmailAddress { get; set; } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/ContactGroupComposite.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/ContactGroupComposite.cs new file mode 100644 index 00000000..e031d1d4 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/ContactGroupComposite.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using UserManagement.Models; + +namespace UserManagement.Composite +{ + public class ContactGroupComposite : IContactComponent + { + public string Name { get; set; } + public IList Members { get; } = new List(); + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/IContactComponent.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/IContactComponent.cs new file mode 100644 index 00000000..a1d89ce6 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Composite/IContactComponent.cs @@ -0,0 +1,9 @@ +using UserManagement.Models; + +namespace UserManagement.Composite +{ + public interface IContactComponent + { + string Name { get; } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Decorator/LoggedEmailService.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Decorator/LoggedEmailService.cs new file mode 100644 index 00000000..18dcbf57 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Decorator/LoggedEmailService.cs @@ -0,0 +1,42 @@ +using System; +using UserManagement.Models; +using UserManagement.Services; + +namespace UserManagement.Decorator +{ + public class LoggedEmailService : IEmailService + { + private readonly IEmailService emailServiceImplementation; + + public LoggedEmailService(IEmailService emailServiceImplementation) + { + this.emailServiceImplementation = emailServiceImplementation; + } + + public void SendEmail(string to, Email email) + { + var methodName = "SendEmail"; + ConsoleLogMessage(ConsoleColor.Yellow, $"Method: {methodName} start"); + try + { + emailServiceImplementation.SendEmail(to, email); + ConsoleLogMessage(ConsoleColor.Yellow, $"Method: {methodName} was succeed"); + } + catch (Exception e) + { + ConsoleLogMessage(ConsoleColor.Red, $"Exception {e} was raised in Method: {methodName}"); + throw; + } + ConsoleLogMessage(ConsoleColor.Yellow, $"Method: {methodName} exit"); + } + + private void ConsoleLogMessage(ConsoleColor color, string message, params object[] args) + { + var originalColor = Console.ForegroundColor; + Console.ForegroundColor = color; + Console.WriteLine(message, args); + Console.ForegroundColor = originalColor; + } + + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Decorator/LoggingInterceptor.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Decorator/LoggingInterceptor.cs new file mode 100644 index 00000000..e36cb4ad --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Decorator/LoggingInterceptor.cs @@ -0,0 +1,33 @@ +using System; +using Castle.DynamicProxy; + +namespace UserManagement.Decorator +{ + public class LoggingInterceptor : IInterceptor + { + public void Intercept(IInvocation invocation) + { + var methodName = invocation.Method.Name; + ConsoleLogMessage(ConsoleColor.Yellow, $"Method: {methodName} start"); + try + { + invocation.Proceed(); + ConsoleLogMessage(ConsoleColor.Yellow, $"Method: {methodName} was succeed"); + } + catch (Exception e) + { + ConsoleLogMessage(ConsoleColor.Red, $"Exception {e} was raised in Method: {methodName}"); + throw; + } + ConsoleLogMessage(ConsoleColor.Yellow, $"Method: {methodName} exit"); + } + + private void ConsoleLogMessage(ConsoleColor color, string message, params object[] args) + { + var originalColor = Console.ForegroundColor; + Console.ForegroundColor = color; + Console.WriteLine(message, args); + Console.ForegroundColor = originalColor; + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Factory/NewsletterFactory.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Factory/NewsletterFactory.cs new file mode 100644 index 00000000..6421e44e --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Factory/NewsletterFactory.cs @@ -0,0 +1,15 @@ +using UserManagement.Models; + +namespace UserManagement.Factory +{ + public class NewsletterFactory + { + public Email CreateNewsletter() + { + string subject = "Máme pro vás jedinečnou nabídku!"; + string body = "Začněte používat návrhové vzory právě teď!"; + + return new Email(subject, body); + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Models/Email.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Models/Email.cs new file mode 100644 index 00000000..305b3909 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Models/Email.cs @@ -0,0 +1,14 @@ +namespace UserManagement.Models +{ + public struct Email + { + public string Subject { get; } + public string Body { get; } + + public Email(string subject, string body) + { + Subject = subject; + Body = body; + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Program.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Program.cs new file mode 100644 index 00000000..8d59d59a --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Program.cs @@ -0,0 +1,38 @@ +using Castle.MicroKernel.Registration; +using Castle.Windsor; +using UserManagement.Decorator; +using UserManagement.Visitor.Advanced; +using UserManagement.Factory; +using UserManagement.Models; +using UserManagement.Services; +using UserManagement.Singleton; + +namespace UserManagement +{ + class Program + { + static void Main() + { + //var program = new UserManagementApp(new DisplayUserVisitor(), new NewsletterFactory(), new SendMailUserVisitor(new LoggedEmailService(new MailerService()))); + //program.Start(); + + var container = CreateContainer(); + var app = container.Resolve(); + app.Start(); + } + + private static WindsorContainer CreateContainer() + { + var container = new WindsorContainer(); + container.Register(Component.For().LifestyleTransient()); + container.Register(Component.For().LifestyleTransient()); + container.Register(Component.For().LifestyleTransient()); + container.Register(Component.For().LifestyleTransient()); + container.Register(Component.For().Instance(EmployeeStorage.Instance));//.ImplementedBy().LifestyleSingleton()); + container.Register(Component.For().ImplementedBy().LifestyleTransient().Interceptors()); + container.Register(Component.For().LifestyleTransient()); + + return container; + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Services/EmailService.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Services/EmailService.cs new file mode 100644 index 00000000..556d730e --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Services/EmailService.cs @@ -0,0 +1,14 @@ +using System; +using UserManagement.Models; + +namespace UserManagement.Services +{ + public class EmailService : IEmailService + { + public void SendEmail(string to, Email email) + { + Console.WriteLine($"Send email to: {to}"); + Console.WriteLine($"\t{email.Subject} - {email.Body}"); + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Services/IEmailService.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Services/IEmailService.cs new file mode 100644 index 00000000..66c4bb85 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Services/IEmailService.cs @@ -0,0 +1,9 @@ +using UserManagement.Models; + +namespace UserManagement.Services +{ + public interface IEmailService + { + void SendEmail(string to, Email email); + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Singleton/EmployeeStorage.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Singleton/EmployeeStorage.cs new file mode 100644 index 00000000..51bf8143 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Singleton/EmployeeStorage.cs @@ -0,0 +1,59 @@ +using UserManagement.Composite; + +namespace UserManagement.Singleton +{ + public class EmployeeStorage : IEmployeeStorage + { + public ContactGroupComposite Developers { get; } + public ContactGroupComposite Employees { get; } + public ContactGroupComposite Designers { get; } + public ContactGroupComposite PythonTeam { get; } + public ContactGroupComposite DotNetTeam { get; } + + public static IEmployeeStorage Instance { get; } = new EmployeeStorage(); + + private EmployeeStorage() + { + var roman = new ContactComponent { Firstname = "Roman", EmailAddress = "roman@super-company.com" }; + var tibor = new ContactComponent { Firstname = "Tibor", EmailAddress = "tibor@super-company.com" }; + var martin = new ContactComponent { Firstname = "Martin", EmailAddress = "martin@super-company.com" }; + var adam = new ContactComponent { Firstname = "Adam", EmailAddress = "adam@super-company.com" }; + var joe = new ContactComponent { Firstname = "Joe", EmailAddress = "joe@super-company.com" }; + var jake = new ContactComponent { Firstname = "Jake", EmailAddress = "jake@super-company.com" }; + var emily = new ContactComponent { Firstname = "Emily", EmailAddress = "emily@super-company.com" }; + var sophia = new ContactComponent { Firstname = "Sophia", EmailAddress = "sophia@super-company.com" }; + var brian = new ContactComponent { Firstname = "Brian", EmailAddress = "brian@super-company.com" }; + var bob = new ContactComponent { Firstname = "Bob", EmailAddress = "bob@super-company.com" }; + + DotNetTeam = new ContactGroupComposite + { + Name = ".NET team", + Members = { roman, tibor, martin, adam } + }; + + PythonTeam = new ContactGroupComposite + { + Name = "Python team", + Members = { emily, sophia, brian, bob } + }; + + Designers = new ContactGroupComposite + { + Name = "Design team", + Members = { joe, jake } + }; + + Developers = new ContactGroupComposite + { + Name = "Developers", + Members = { DotNetTeam, PythonTeam } + }; + + Employees = new ContactGroupComposite + { + Name = "Employees", + Members = { Developers, Designers } + }; + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Singleton/IEmployeeStorage.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Singleton/IEmployeeStorage.cs new file mode 100644 index 00000000..949d8250 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Singleton/IEmployeeStorage.cs @@ -0,0 +1,13 @@ +using UserManagement.Composite; + +namespace UserManagement.Singleton +{ + public interface IEmployeeStorage + { + ContactGroupComposite Developers { get; } + ContactGroupComposite Employees { get; } + ContactGroupComposite Designers { get; } + ContactGroupComposite PythonTeam { get; } + ContactGroupComposite DotNetTeam { get; } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/UserManagement.csproj b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/UserManagement.csproj new file mode 100644 index 00000000..791aa084 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/UserManagement.csproj @@ -0,0 +1,12 @@ + + + + Exe + netcoreapp2.0 + + + + + + + diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/UserManagementApp.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/UserManagementApp.cs new file mode 100644 index 00000000..5ee20d26 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/UserManagementApp.cs @@ -0,0 +1,34 @@ +using System; +using UserManagement.Factory; +using UserManagement.Singleton; +using UserManagement.Visitor.Advanced; + +namespace UserManagement +{ + class UserManagementApp + { + private readonly DisplayUserVisitor displayUserVisitor; + private readonly NewsletterFactory newsletterFactory; + private readonly SendMailUserVisitor sendMailUserVisitor; + private readonly IEmployeeStorage employeeStorage; + + public UserManagementApp(DisplayUserVisitor displayUserVisitor, NewsletterFactory newsletterFactory, SendMailUserVisitor sendMailUserVisitor, IEmployeeStorage employeeStorage) + { + this.displayUserVisitor = displayUserVisitor; + this.newsletterFactory = newsletterFactory; + this.sendMailUserVisitor = sendMailUserVisitor; + this.employeeStorage = employeeStorage; + } + + + public void Start() + { + displayUserVisitor.Print(employeeStorage.Employees); + + Console.WriteLine(new string('-', 100)); + + var newsletter = newsletterFactory.CreateNewsletter(); + sendMailUserVisitor.SendEmail(employeeStorage.Developers, newsletter); + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/DisplayUserVisitor.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/DisplayUserVisitor.cs new file mode 100644 index 00000000..f8ee3f57 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/DisplayUserVisitor.cs @@ -0,0 +1,38 @@ +using System; +using UserManagement.Composite; + +namespace UserManagement.Visitor.Advanced +{ + public class DisplayUserVisitor : UserVisitorBase + { + private int indent; + public void Print(IContactComponent contactComponent) + { + indent = 0; + base.Visit(contactComponent); + } + + protected override void Visit(ContactComponent contactComponent) + { + PrintIndentedText($"User: {contactComponent.Name}"); + } + + protected override void Visit(ContactGroupComposite contactGroupComposite) + { + PrintIndentedText($"Group: {contactGroupComposite.Name}"); + indent++; + foreach (var member in contactGroupComposite.Members) + { + Visit(member); + } + indent--; + } + + private void PrintIndentedText(string text) + { + var indentTabs = new string('\t', indent); + Console.WriteLine(indentTabs + text); + } + } + +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/SendMailUserVisitor.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/SendMailUserVisitor.cs new file mode 100644 index 00000000..c1a4b707 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/SendMailUserVisitor.cs @@ -0,0 +1,37 @@ +using UserManagement.Composite; +using UserManagement.Models; +using UserManagement.Services; + +namespace UserManagement.Visitor.Advanced +{ + public class SendMailUserVisitor : UserVisitorBase + { + + private readonly IEmailService emailService; + private Email email; + + public SendMailUserVisitor(IEmailService emailService) + { + this.emailService = emailService; + } + + public void SendEmail(IContactComponent contactComponent, Email email) + { + this.email = email; + base.Visit(contactComponent); + } + + protected override void Visit(ContactComponent contactComponent) + { + emailService.SendEmail(contactComponent.EmailAddress, email); + } + + protected override void Visit(ContactGroupComposite contactGroupComposite) + { + foreach (var member in contactGroupComposite.Members) + { + SendEmail(member, email); + } + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/UserVisitorBase.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/UserVisitorBase.cs new file mode 100644 index 00000000..1ce06d8a --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/Advanced/UserVisitorBase.cs @@ -0,0 +1,25 @@ +using System; +using UserManagement.Composite; + +namespace UserManagement.Visitor.Advanced +{ + public abstract class UserVisitorBase + { + protected virtual void Visit(IContactComponent contactComponent) + { + switch (contactComponent) + { + case ContactComponent component: + Visit(component); + break; + case ContactGroupComposite composite: + Visit(composite); + break; + default: + throw new NotSupportedException(); + } + } + protected abstract void Visit(ContactComponent contactComponent); + protected abstract void Visit(ContactGroupComposite contactGroupComposite); + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/DisplayUserVisitor.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/DisplayUserVisitor.cs new file mode 100644 index 00000000..30459ef3 --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/DisplayUserVisitor.cs @@ -0,0 +1,50 @@ +using System; +using UserManagement.Composite; + +namespace UserManagement.Visitor +{ + public class DisplayUserVisitor + { + public void Print(IContactComponent contactComponent) + { + Print(contactComponent, 0); + } + + private void Print(IContactComponent contactComponent, int indent) + { + if (contactComponent is ContactComponent) + { + Print((ContactComponent)contactComponent, indent); + } + else if (contactComponent is ContactGroupComposite) + { + Print((ContactGroupComposite)contactComponent, indent); + } + else + { + throw new NotSupportedException(); + } + } + + private void Print(ContactComponent contactComponent, int indent) + { + PrintIndentedText($"User: {contactComponent.Name}", indent); + } + + private void Print(ContactGroupComposite contactGroupComposite, int indent) + { + PrintIndentedText($"Group: {contactGroupComposite.Name}", indent); + indent++; + foreach (var member in contactGroupComposite.Members) + { + Print(member, indent); + } + } + + private void PrintIndentedText(string text, int indent) + { + var indentTabs = new string('\t', indent); + Console.WriteLine(indentTabs + text); + } + } +} \ No newline at end of file diff --git a/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/SendMailUserVisitor.cs b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/SendMailUserVisitor.cs new file mode 100644 index 00000000..0b71d7bd --- /dev/null +++ b/Lectures/Extended_02/UserManagement-before/UserManagement/UserManagement/Visitor/SendMailUserVisitor.cs @@ -0,0 +1,47 @@ +using System; +using UserManagement.Composite; +using UserManagement.Models; +using UserManagement.Services; + +namespace UserManagement.ConsoleApp.Visitor +{ + public class SendMailUserVisitor + { + + private readonly IEmailService emailService; + + public SendMailUserVisitor(IEmailService emailService) + { + this.emailService = emailService; + } + + public void SendEmail(IContactComponent contactComponent, Email email) + { + if (contactComponent is ContactComponent) + { + SendEmail((ContactComponent)contactComponent, email); + } + else if (contactComponent is ContactGroupComposite) + { + SendEmail((ContactGroupComposite)contactComponent, email); + } + else + { + throw new NotSupportedException(); + } + } + + private void SendEmail(ContactComponent contactComponent, Email email) + { + emailService.SendEmail(contactComponent.EmailAddress, email); + } + + private void SendEmail(ContactGroupComposite contactGroupComposite, Email email) + { + foreach (var member in contactGroupComposite.Members) + { + SendEmail(member, email); + } + } + } +} \ No newline at end of file