From dbb9a53a97cec748ef7c1c4a481613917cced46f Mon Sep 17 00:00:00 2001 From: eminencegrs Date: Sat, 3 Feb 2024 18:54:40 +0100 Subject: [PATCH] Implement AbstractFactory. --- .../DataLake/Directory.cs | 8 +++ .../DataLake/File.cs | 8 +++ .../DataLake/Storage.cs | 51 +++++++++++++++++++ .../DataLake/StorageFactory.cs | 20 ++++++++ .../DataLake/StorageSettings.cs | 6 +++ .../DataLakeStorage.cs | 14 ----- .../DesignPatterns.AbstractFactory.csproj | 13 ++++- .../Directory.cs | 5 -- .../DesignPatterns.AbstractFactory/File.cs | 5 -- .../DesignPatterns.AbstractFactory/IPath.cs | 5 -- .../IPathInfo.cs | 7 +++ .../IStorage.cs | 4 +- .../IStorageFactory.cs | 9 +--- .../Local/Directory.cs | 7 +++ .../Local/File.cs | 7 +++ .../Local/Storage.cs | 39 ++++++++++++++ .../Local/StorageFactory.cs | 16 ++++++ .../Local/StorageSettings.cs | 6 +++ .../LocalStorage.cs | 14 ----- .../DesignPatterns.AbstractFactory/Program.cs | 10 +++- .../appsettings.json | 8 +++ 21 files changed, 206 insertions(+), 56 deletions(-) create mode 100644 Creational/DesignPatterns.AbstractFactory/DataLake/Directory.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/DataLake/File.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/DataLake/Storage.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/DataLake/StorageFactory.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/DataLake/StorageSettings.cs delete mode 100644 Creational/DesignPatterns.AbstractFactory/DataLakeStorage.cs delete mode 100644 Creational/DesignPatterns.AbstractFactory/Directory.cs delete mode 100644 Creational/DesignPatterns.AbstractFactory/File.cs delete mode 100644 Creational/DesignPatterns.AbstractFactory/IPath.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/IPathInfo.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/Local/Directory.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/Local/File.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/Local/Storage.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/Local/StorageFactory.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/Local/StorageSettings.cs delete mode 100644 Creational/DesignPatterns.AbstractFactory/LocalStorage.cs create mode 100644 Creational/DesignPatterns.AbstractFactory/appsettings.json diff --git a/Creational/DesignPatterns.AbstractFactory/DataLake/Directory.cs b/Creational/DesignPatterns.AbstractFactory/DataLake/Directory.cs new file mode 100644 index 0000000..19eaf05 --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/DataLake/Directory.cs @@ -0,0 +1,8 @@ +namespace DesignPatterns.AbstractFactory.DataLake; + +public class Directory : IPathInfo +{ + public string Name { get; init; } + public string Path { get; init; } + public string Uri { get; init; } +} diff --git a/Creational/DesignPatterns.AbstractFactory/DataLake/File.cs b/Creational/DesignPatterns.AbstractFactory/DataLake/File.cs new file mode 100644 index 0000000..100ddf8 --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/DataLake/File.cs @@ -0,0 +1,8 @@ +namespace DesignPatterns.AbstractFactory.DataLake; + +public class File : IPathInfo +{ + public string Name { get; init; } + public string Path { get; init; } + public string Uri { get; init; } +} diff --git a/Creational/DesignPatterns.AbstractFactory/DataLake/Storage.cs b/Creational/DesignPatterns.AbstractFactory/DataLake/Storage.cs new file mode 100644 index 0000000..bc49a4c --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/DataLake/Storage.cs @@ -0,0 +1,51 @@ +using Azure.Storage.Files.DataLake; + +namespace DesignPatterns.AbstractFactory.DataLake; + +public class Storage : IStorage +{ + private readonly StorageSettings settings; + private readonly DataLakeServiceClient dataLakeServiceClient; + + public Storage(StorageSettings settings, DataLakeServiceClient dataLakeServiceClient) + { + this.settings = settings; + this.dataLakeServiceClient = dataLakeServiceClient; + } + + public async Task CreateDirectory(string name) + { + var fileSystemClient = this.dataLakeServiceClient.GetFileSystemClient(this.settings.FileSystemName); + await fileSystemClient.CreateIfNotExistsAsync(); + var response = await fileSystemClient.CreateDirectoryAsync(name); + if (!response.HasValue) + { + throw new DirectoryNotFoundException($"Could not create the '{name}' directory."); + } + + return new Directory + { + Name = response.Value.Name, + Path = response.Value.Path, + Uri = response.Value.Path + }; + } + + public async Task CreateFile(string name) + { + var fileSystemClient = this.dataLakeServiceClient.GetFileSystemClient(this.settings.FileSystemName); + await fileSystemClient.CreateIfNotExistsAsync(); + var response = await fileSystemClient.CreateFileAsync(name); + if (!response.HasValue) + { + throw new FileNotFoundException($"Could not create the '{name}' file."); + } + + return new File + { + Name = response.Value.Name, + Path = response.Value.Path, + Uri = response.Value.Path + }; + } +} diff --git a/Creational/DesignPatterns.AbstractFactory/DataLake/StorageFactory.cs b/Creational/DesignPatterns.AbstractFactory/DataLake/StorageFactory.cs new file mode 100644 index 0000000..6a69591 --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/DataLake/StorageFactory.cs @@ -0,0 +1,20 @@ +using Azure.Storage.Files.DataLake; + +namespace DesignPatterns.AbstractFactory.DataLake; + +public class StorageFactory : IStorageFactory +{ + private readonly StorageSettings settings; + private readonly DataLakeServiceClient serviceClient; + + public StorageFactory(StorageSettings settings, DataLakeServiceClient serviceClient) + { + this.settings = settings; + this.serviceClient = serviceClient; + } + + public IStorage Create() + { + return new Storage(settings, serviceClient); + } +} diff --git a/Creational/DesignPatterns.AbstractFactory/DataLake/StorageSettings.cs b/Creational/DesignPatterns.AbstractFactory/DataLake/StorageSettings.cs new file mode 100644 index 0000000..7c95e2c --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/DataLake/StorageSettings.cs @@ -0,0 +1,6 @@ +namespace DesignPatterns.AbstractFactory.DataLake; + +public class StorageSettings +{ + public string FileSystemName { get; init; } +} diff --git a/Creational/DesignPatterns.AbstractFactory/DataLakeStorage.cs b/Creational/DesignPatterns.AbstractFactory/DataLakeStorage.cs deleted file mode 100644 index 3fb0974..0000000 --- a/Creational/DesignPatterns.AbstractFactory/DataLakeStorage.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace DesignPatterns.AbstractFactory; - -public class DataLakeStorage : IStorage -{ - public Task CreateDirectory(string name) - { - throw new NotImplementedException(); - } - - public Task CreateFile(string name) - { - throw new NotImplementedException(); - } -} diff --git a/Creational/DesignPatterns.AbstractFactory/DesignPatterns.AbstractFactory.csproj b/Creational/DesignPatterns.AbstractFactory/DesignPatterns.AbstractFactory.csproj index 1710e28..4428c3d 100644 --- a/Creational/DesignPatterns.AbstractFactory/DesignPatterns.AbstractFactory.csproj +++ b/Creational/DesignPatterns.AbstractFactory/DesignPatterns.AbstractFactory.csproj @@ -8,4 +8,15 @@ DesignPatterns.AbstractFactory - + + + + + + + + Always + + + + \ No newline at end of file diff --git a/Creational/DesignPatterns.AbstractFactory/Directory.cs b/Creational/DesignPatterns.AbstractFactory/Directory.cs deleted file mode 100644 index e4bccd9..0000000 --- a/Creational/DesignPatterns.AbstractFactory/Directory.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace DesignPatterns.AbstractFactory; - -public class Directory : IPath -{ -} diff --git a/Creational/DesignPatterns.AbstractFactory/File.cs b/Creational/DesignPatterns.AbstractFactory/File.cs deleted file mode 100644 index 420794a..0000000 --- a/Creational/DesignPatterns.AbstractFactory/File.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace DesignPatterns.AbstractFactory; - -public class File : IPath -{ -} diff --git a/Creational/DesignPatterns.AbstractFactory/IPath.cs b/Creational/DesignPatterns.AbstractFactory/IPath.cs deleted file mode 100644 index 654b013..0000000 --- a/Creational/DesignPatterns.AbstractFactory/IPath.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace DesignPatterns.AbstractFactory; - -public interface IPath -{ -} diff --git a/Creational/DesignPatterns.AbstractFactory/IPathInfo.cs b/Creational/DesignPatterns.AbstractFactory/IPathInfo.cs new file mode 100644 index 0000000..15929fe --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/IPathInfo.cs @@ -0,0 +1,7 @@ +namespace DesignPatterns.AbstractFactory; + +public interface IPathInfo +{ + string Name { get; } + string Path { get; } +} diff --git a/Creational/DesignPatterns.AbstractFactory/IStorage.cs b/Creational/DesignPatterns.AbstractFactory/IStorage.cs index a9ca78b..ad0a079 100644 --- a/Creational/DesignPatterns.AbstractFactory/IStorage.cs +++ b/Creational/DesignPatterns.AbstractFactory/IStorage.cs @@ -2,6 +2,6 @@ namespace DesignPatterns.AbstractFactory; public interface IStorage { - Task CreateDirectory(string name); - Task CreateFile(string name); + Task CreateDirectory(string name); + Task CreateFile(string name); } diff --git a/Creational/DesignPatterns.AbstractFactory/IStorageFactory.cs b/Creational/DesignPatterns.AbstractFactory/IStorageFactory.cs index 1852936..a0bb19d 100644 --- a/Creational/DesignPatterns.AbstractFactory/IStorageFactory.cs +++ b/Creational/DesignPatterns.AbstractFactory/IStorageFactory.cs @@ -2,12 +2,5 @@ namespace DesignPatterns.AbstractFactory; public interface IStorageFactory { -} - -public class LocalStorageFactory : IStorageFactory -{ -} - -public class AzureStorageFactory : IStorageFactory -{ + IStorage Create(); } diff --git a/Creational/DesignPatterns.AbstractFactory/Local/Directory.cs b/Creational/DesignPatterns.AbstractFactory/Local/Directory.cs new file mode 100644 index 0000000..d1a5d8f --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/Local/Directory.cs @@ -0,0 +1,7 @@ +namespace DesignPatterns.AbstractFactory.Local; + +public class Directory : IPathInfo +{ + public string Name { get; init; } + public string Path { get; init; } +} diff --git a/Creational/DesignPatterns.AbstractFactory/Local/File.cs b/Creational/DesignPatterns.AbstractFactory/Local/File.cs new file mode 100644 index 0000000..c095fb3 --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/Local/File.cs @@ -0,0 +1,7 @@ +namespace DesignPatterns.AbstractFactory.Local; + +public class File : IPathInfo +{ + public string Name { get; init; } + public string Path { get; init; } +} diff --git a/Creational/DesignPatterns.AbstractFactory/Local/Storage.cs b/Creational/DesignPatterns.AbstractFactory/Local/Storage.cs new file mode 100644 index 0000000..f74ea08 --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/Local/Storage.cs @@ -0,0 +1,39 @@ +namespace DesignPatterns.AbstractFactory.Local; + +public class Storage : IStorage +{ + private readonly StorageSettings settings; + + public Storage(StorageSettings settings) + { + this.settings = settings; + } + + public Task CreateDirectory(string name) + { + var directoryPath = Path.Combine(this.settings.Path, name); + var directoryInfo = new DirectoryInfo(directoryPath); + directoryInfo.Create(); + var result = new Directory + { + Name = directoryInfo.Name, + Path = directoryInfo.FullName + }; + + return Task.FromResult(result); + } + + public Task CreateFile(string name) + { + var filePath = Path.Combine(this.settings.Path, name); + var fileInfo = new FileInfo(filePath); + fileInfo.Create(); + var result = new File + { + Name = fileInfo.Name, + Path = fileInfo.FullName + }; + + return Task.FromResult(result); + } +} diff --git a/Creational/DesignPatterns.AbstractFactory/Local/StorageFactory.cs b/Creational/DesignPatterns.AbstractFactory/Local/StorageFactory.cs new file mode 100644 index 0000000..0602725 --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/Local/StorageFactory.cs @@ -0,0 +1,16 @@ +namespace DesignPatterns.AbstractFactory.Local; + +public class StorageFactory : IStorageFactory +{ + private readonly StorageSettings settings; + + public StorageFactory(StorageSettings settings) + { + this.settings = settings; + } + + public IStorage Create() + { + return new Storage(this.settings); + } +} diff --git a/Creational/DesignPatterns.AbstractFactory/Local/StorageSettings.cs b/Creational/DesignPatterns.AbstractFactory/Local/StorageSettings.cs new file mode 100644 index 0000000..d056f8e --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/Local/StorageSettings.cs @@ -0,0 +1,6 @@ +namespace DesignPatterns.AbstractFactory.Local; + +public class StorageSettings +{ + public string Path { get; init; } +} diff --git a/Creational/DesignPatterns.AbstractFactory/LocalStorage.cs b/Creational/DesignPatterns.AbstractFactory/LocalStorage.cs deleted file mode 100644 index 40671cd..0000000 --- a/Creational/DesignPatterns.AbstractFactory/LocalStorage.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace DesignPatterns.AbstractFactory; - -public class LocalStorage : IStorage -{ - public Task CreateDirectory(string name) - { - throw new NotImplementedException(); - } - - public Task CreateFile(string name) - { - throw new NotImplementedException(); - } -} diff --git a/Creational/DesignPatterns.AbstractFactory/Program.cs b/Creational/DesignPatterns.AbstractFactory/Program.cs index e5dff12..7193e17 100644 --- a/Creational/DesignPatterns.AbstractFactory/Program.cs +++ b/Creational/DesignPatterns.AbstractFactory/Program.cs @@ -1,3 +1,9 @@ -// See https://aka.ms/new-console-template for more information +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; -Console.WriteLine("Hello, World!"); \ No newline at end of file +var host = Host.CreateDefaultBuilder(args) + .ConfigureAppConfiguration(ctx => ctx.AddJsonFile("appsettings.json")) + .ConfigureServices(services => { }) + .Build(); + +Console.WriteLine(); \ No newline at end of file diff --git a/Creational/DesignPatterns.AbstractFactory/appsettings.json b/Creational/DesignPatterns.AbstractFactory/appsettings.json new file mode 100644 index 0000000..e531f99 --- /dev/null +++ b/Creational/DesignPatterns.AbstractFactory/appsettings.json @@ -0,0 +1,8 @@ +{ + "DataLake": { + "FileSystemName": "abstract-factory-example" + }, + "Local": { + "Path": "/home" + } +} \ No newline at end of file