From 4d30c85d41872f8b4b6904004e604cf7f65ed520 Mon Sep 17 00:00:00 2001 From: Mihai Manolache Date: Wed, 7 Oct 2020 16:27:44 -0700 Subject: [PATCH] Add Dependecy Injection --- DependencyInjection/DIMedia.csproj | 8 ++ DependencyInjection/DevicePlayer/CDPlayer.cs | 21 +++++ .../DevicePlayer/CasettePlayer.cs | 21 +++++ DependencyInjection/DevicePlayer/DVDPlayer.cs | 21 +++++ .../DevicePlayer/DevicePlayer.cs | 33 ++++++++ .../DevicePlayer/IDevicePlayer.cs | 8 ++ .../Injector/DevicePlayerSelector.cs | 27 ++++++ .../Injector/IDevicePlayerSelector.cs | 10 +++ DependencyInjection/Media/MediaContent.cs | 11 +++ DependencyInjection/Media/MediaType.cs | 11 +++ DependencyInjection/Player/IMediaPlayer.cs | 7 ++ DependencyInjection/Player/MediaPlayer.cs | 33 ++++++++ DependencyInjection/Program.cs | 83 +++++++++++++++++++ 13 files changed, 294 insertions(+) create mode 100644 DependencyInjection/DIMedia.csproj create mode 100644 DependencyInjection/DevicePlayer/CDPlayer.cs create mode 100644 DependencyInjection/DevicePlayer/CasettePlayer.cs create mode 100644 DependencyInjection/DevicePlayer/DVDPlayer.cs create mode 100644 DependencyInjection/DevicePlayer/DevicePlayer.cs create mode 100644 DependencyInjection/DevicePlayer/IDevicePlayer.cs create mode 100644 DependencyInjection/Injector/DevicePlayerSelector.cs create mode 100644 DependencyInjection/Injector/IDevicePlayerSelector.cs create mode 100644 DependencyInjection/Media/MediaContent.cs create mode 100644 DependencyInjection/Media/MediaType.cs create mode 100644 DependencyInjection/Player/IMediaPlayer.cs create mode 100644 DependencyInjection/Player/MediaPlayer.cs create mode 100644 DependencyInjection/Program.cs diff --git a/DependencyInjection/DIMedia.csproj b/DependencyInjection/DIMedia.csproj new file mode 100644 index 0000000..c73e0d1 --- /dev/null +++ b/DependencyInjection/DIMedia.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/DependencyInjection/DevicePlayer/CDPlayer.cs b/DependencyInjection/DevicePlayer/CDPlayer.cs new file mode 100644 index 0000000..192cbee --- /dev/null +++ b/DependencyInjection/DevicePlayer/CDPlayer.cs @@ -0,0 +1,21 @@ +namespace DIMedia.DevicePlayer +{ + using DIMedia.Media; + using System; + + public class CDPlayer : DevicePlayer + { + private readonly MediaType mediaType = MediaType.CDDisk; + + public CDPlayer(MediaContent mediaContent) : + base(mediaContent) + { + if (this.mediaType != mediaContent.MediaType) + { + throw new Exception($"{this.GetType().Name} cannot play {mediaContent.MediaType}."); + } + + Console.WriteLine($"Loading {mediaContent.MediaType} in {this.GetType().Name}..."); + } + } +} diff --git a/DependencyInjection/DevicePlayer/CasettePlayer.cs b/DependencyInjection/DevicePlayer/CasettePlayer.cs new file mode 100644 index 0000000..6d120cb --- /dev/null +++ b/DependencyInjection/DevicePlayer/CasettePlayer.cs @@ -0,0 +1,21 @@ +namespace DIMedia.DevicePlayer +{ + using DIMedia.Media; + using System; + + public class CasettePlayer : DevicePlayer + { + private readonly MediaType mediaType = MediaType.Tape; + + public CasettePlayer(MediaContent mediaContent) : + base(mediaContent) + { + if (this.mediaType != mediaContent.MediaType) + { + throw new Exception($"{this.GetType().Name} cannot play {mediaContent.MediaType}."); + } + + Console.WriteLine($"Loading {mediaContent.MediaType} in {this.GetType().Name}..."); + } + } +} diff --git a/DependencyInjection/DevicePlayer/DVDPlayer.cs b/DependencyInjection/DevicePlayer/DVDPlayer.cs new file mode 100644 index 0000000..6a07877 --- /dev/null +++ b/DependencyInjection/DevicePlayer/DVDPlayer.cs @@ -0,0 +1,21 @@ +namespace DIMedia.DevicePlayer +{ + using DIMedia.Media; + using System; + + public class DVDPlayer : DevicePlayer + { + private readonly MediaType mediaType = MediaType.DVDDisk; + + public DVDPlayer(MediaContent mediaContent) : + base(mediaContent) + { + if (this.mediaType != mediaContent.MediaType) + { + throw new Exception($"{this.GetType().Name} cannot play {mediaContent.MediaType}."); + } + + Console.WriteLine($"Loading {mediaContent.MediaType} in {this.GetType().Name}..."); + } + } +} diff --git a/DependencyInjection/DevicePlayer/DevicePlayer.cs b/DependencyInjection/DevicePlayer/DevicePlayer.cs new file mode 100644 index 0000000..715c5c5 --- /dev/null +++ b/DependencyInjection/DevicePlayer/DevicePlayer.cs @@ -0,0 +1,33 @@ +using DIMedia.Media; +using System; + +namespace DIMedia.DevicePlayer +{ + public abstract class DevicePlayer : IDevicePlayer + { + protected readonly MediaContent mediaContent; + + public DevicePlayer(MediaContent mediaContent) + { + this.mediaContent = mediaContent ?? throw new ArgumentNullException(nameof(mediaContent)); + } + + public virtual void Play() + { + Console.WriteLine($"Playing {mediaContent.Title} with {this.GetType().Name}."); + + foreach (string item in mediaContent.Content) + { + Console.WriteLine($"Playing {item}..."); + } + + Console.WriteLine($"Eject {mediaContent.MediaType}..."); + Console.WriteLine(); + } + + public virtual void Pause() + { + Console.WriteLine($"Pause."); + } + } +} diff --git a/DependencyInjection/DevicePlayer/IDevicePlayer.cs b/DependencyInjection/DevicePlayer/IDevicePlayer.cs new file mode 100644 index 0000000..8666d3f --- /dev/null +++ b/DependencyInjection/DevicePlayer/IDevicePlayer.cs @@ -0,0 +1,8 @@ +namespace DIMedia.DevicePlayer +{ + public interface IDevicePlayer + { + void Pause(); + void Play(); + } +} \ No newline at end of file diff --git a/DependencyInjection/Injector/DevicePlayerSelector.cs b/DependencyInjection/Injector/DevicePlayerSelector.cs new file mode 100644 index 0000000..dd84ed7 --- /dev/null +++ b/DependencyInjection/Injector/DevicePlayerSelector.cs @@ -0,0 +1,27 @@ +namespace DIMedia.Selector +{ + using DIMedia.DevicePlayer; + using DIMedia.Media; + using DIMedia.Player; + + public class DevicePlayerSelector : IDevicePlayerSelector + { + public IMediaPlayer GetDevicePlayer(MediaContent mediaContent) + { + switch (mediaContent.MediaType) + { + case MediaType.Tape: + return new MediaPlayer(new CasettePlayer(mediaContent)); + + case MediaType.CDDisk: + return new MediaPlayer(new CDPlayer(mediaContent)); + + case MediaType.DVDDisk: + return new MediaPlayer(new DVDPlayer(mediaContent)); + + default: + return null; + } + } + } +} diff --git a/DependencyInjection/Injector/IDevicePlayerSelector.cs b/DependencyInjection/Injector/IDevicePlayerSelector.cs new file mode 100644 index 0000000..3e1bd01 --- /dev/null +++ b/DependencyInjection/Injector/IDevicePlayerSelector.cs @@ -0,0 +1,10 @@ +namespace DIMedia.Selector +{ + using DIMedia.Media; + using DIMedia.Player; + + public interface IDevicePlayerSelector + { + IMediaPlayer GetDevicePlayer(MediaContent mediaContent); + } +} \ No newline at end of file diff --git a/DependencyInjection/Media/MediaContent.cs b/DependencyInjection/Media/MediaContent.cs new file mode 100644 index 0000000..385edc3 --- /dev/null +++ b/DependencyInjection/Media/MediaContent.cs @@ -0,0 +1,11 @@ +namespace DIMedia.Media +{ + using System.Collections.Generic; + + public class MediaContent + { + public MediaType MediaType { get; set; } + public object Title { get; internal set; } + public List Content { get; set; } + } +} diff --git a/DependencyInjection/Media/MediaType.cs b/DependencyInjection/Media/MediaType.cs new file mode 100644 index 0000000..d2f8803 --- /dev/null +++ b/DependencyInjection/Media/MediaType.cs @@ -0,0 +1,11 @@ +namespace DIMedia.Media +{ + public enum MediaType + { + Vinyl, + Tape, + CDDisk, + DVDDisk, + Digital + }; +} diff --git a/DependencyInjection/Player/IMediaPlayer.cs b/DependencyInjection/Player/IMediaPlayer.cs new file mode 100644 index 0000000..bb6e41a --- /dev/null +++ b/DependencyInjection/Player/IMediaPlayer.cs @@ -0,0 +1,7 @@ +namespace DIMedia.Player +{ + public interface IMediaPlayer + { + void PlayMediaContent(); + } +} \ No newline at end of file diff --git a/DependencyInjection/Player/MediaPlayer.cs b/DependencyInjection/Player/MediaPlayer.cs new file mode 100644 index 0000000..dbfcfeb --- /dev/null +++ b/DependencyInjection/Player/MediaPlayer.cs @@ -0,0 +1,33 @@ +namespace DIMedia.Player +{ + using DIMedia.DevicePlayer; + + public class MediaPlayer : IMediaPlayer + { + // this line could be uncommented in the case of constructor/method injection + // private IDevicePlayer devicePlayer; + + // in case of constructor/method, the setter should be private + public IDevicePlayer DevicePlayer { get; set; } + + public MediaPlayer() + { } + + // with constructor + public MediaPlayer(IDevicePlayer devicePlayer) + { + this.DevicePlayer = devicePlayer; + } + + // with method + public void Register(IDevicePlayer devicePlayer) + { + this.DevicePlayer = devicePlayer; + } + + public void PlayMediaContent() + { + this.DevicePlayer.Play(); + } + } +} diff --git a/DependencyInjection/Program.cs b/DependencyInjection/Program.cs new file mode 100644 index 0000000..4cb0ef4 --- /dev/null +++ b/DependencyInjection/Program.cs @@ -0,0 +1,83 @@ +namespace DIMedia +{ + using DIMedia.DevicePlayer; + using DIMedia.Media; + using DIMedia.Player; + using DIMedia.Selector; + using System.Collections.Generic; + + class Program + { + static void Main() + { + MediaContent tapeContent = new MediaContent() + { + MediaType = MediaType.Tape, + Title = "Oldies, but Goldies!", + Content = new List() { + "1 - Name - Old Song", + "2 - Name - Old Song", + "3 - Name - Old Song" + }, + }; + + MediaContent cdContent = new MediaContent() + { + MediaType = MediaType.CDDisk, + Title = "Jazz", + Content = new List() { + "1 - Name - Jazz Song", + "2 - Name - Jazz Song", + "3 - Name - Jazz Song" + }, + }; + + MediaContent dvdContent = new MediaContent() + { + MediaType = MediaType.DVDDisk, + Title = "Rock!", + Content = new List() { + "1 - Name - Rock Song", + "2 - Name - Rock Song", + "3 - Name - Rock Song" + }, + }; + + // using the injector class + IDevicePlayerSelector playerSelector = new DevicePlayerSelector(); + + // get the player by content + IMediaPlayer mediaCasettePlayer = playerSelector.GetDevicePlayer(tapeContent); + mediaCasettePlayer.PlayMediaContent(); + + IMediaPlayer mediaCdPlayer = playerSelector.GetDevicePlayer(cdContent); + mediaCdPlayer.PlayMediaContent(); + + IMediaPlayer mediaDvdPlayer = playerSelector.GetDevicePlayer(dvdContent); + mediaDvdPlayer.PlayMediaContent(); + + // constructor injection + CasettePlayer casettePlayer = new CasettePlayer(tapeContent); + + // registration + IMediaPlayer mediaPlayer = new MediaPlayer(casettePlayer); + mediaPlayer.PlayMediaContent(); + + // method injection + CDPlayer cdPlayer = new CDPlayer(cdContent); + MediaPlayer anotherMediaPlayer = new MediaPlayer(); + // registration + anotherMediaPlayer.Register(cdPlayer); + anotherMediaPlayer.PlayMediaContent(); + + // setter injection + DVDPlayer dvdPlayer = new DVDPlayer(dvdContent); + // registration + MediaPlayer newMediaPlayer = new MediaPlayer() + { + DevicePlayer = dvdPlayer, + }; + newMediaPlayer.PlayMediaContent(); + } + } +}