From 9e8472fb10f222d32c385b3c58dae03d50f7833b Mon Sep 17 00:00:00 2001 From: Dmitry Sikorsky Date: Tue, 29 Nov 2022 20:34:30 +0200 Subject: [PATCH 01/13] Moved from .NET 6 to .NET 7 --- README.md | 2 +- .../ExtCore.Data.Abstractions.csproj | 2 +- .../ExtCore.Data.Dapper.MySql.csproj | 6 +++--- .../ExtCore.Data.Dapper.PostgreSql.csproj | 6 +++--- .../ExtCore.Data.Dapper.SqlServer.csproj | 4 ++-- .../ExtCore.Data.Dapper.Sqlite.csproj | 6 +++--- src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj | 4 ++-- src/ExtCore.Data.Dapper/Extension.cs | 2 +- .../ExtCore.Data.Entities.Abstractions.csproj | 2 +- .../ExtCore.Data.EntityFramework.MySql.csproj | 6 +++--- .../ExtCore.Data.EntityFramework.PostgreSql.csproj | 6 +++--- .../ExtCore.Data.EntityFramework.SqlServer.csproj | 6 +++--- .../ExtCore.Data.EntityFramework.Sqlite.csproj | 6 +++--- .../ExtCore.Data.EntityFramework.csproj | 6 +++--- src/ExtCore.Data.EntityFramework/Extension.cs | 2 +- src/ExtCore.Data/ExtCore.Data.csproj | 4 ++-- src/ExtCore.Data/Extension.cs | 2 +- src/ExtCore.Events/ExtCore.Events.csproj | 4 ++-- src/ExtCore.Events/Extension.cs | 2 +- .../ExtCore.FileStorage.Abstractions.csproj | 2 +- .../ExtCore.FileStorage.Azure.csproj | 8 ++++---- .../ExtCore.FileStorage.Dropbox.csproj | 6 +++--- .../ExtCore.FileStorage.FileSystem.csproj | 4 ++-- src/ExtCore.FileStorage/ExtCore.FileStorage.csproj | 4 ++-- src/ExtCore.FileStorage/Extension.cs | 2 +- src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj | 4 ++-- .../ExtCore.Mvc.Infrastructure.csproj | 4 ++-- src/ExtCore.Mvc/ExtCore.Mvc.csproj | 6 +++--- src/ExtCore.Mvc/Extension.cs | 2 +- src/ExtCore.WebApplication/ExtCore.WebApplication.csproj | 6 +++--- 30 files changed, 63 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 3835991..76f5662 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ExtCore 7.1.3 +# ExtCore 8.0.0 [![Join the chat at https://gitter.im/ExtCore/ExtCore](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ExtCore/ExtCore?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj b/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj index 60010e6..2335d6c 100644 --- a/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj +++ b/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data extension component. Based on the ExtCore framework. - 7.1.3 + 8.0.0 netstandard2.0 ExtCore.Data.Abstractions ExtCore.Data.Abstractions diff --git a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj index 1f24fcd..681bbcb 100644 --- a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj +++ b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.Dapper.MySql ExtCore.Data.Dapper.MySql icon.png @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj index 5a423fd..8bbddf0 100644 --- a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj +++ b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.Dapper.PostgreSql ExtCore.Data.Dapper.PostgreSql icon.png @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj index 4f8c1cc..497fb5a 100644 --- a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj +++ b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.Dapper.SqlServer ExtCore.Data.Dapper.SqlServer icon.png diff --git a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj index 7e62b54..94ea910 100644 --- a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj +++ b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.Dapper.Sqlite ExtCore.Data.Dapper.Sqlite icon.png @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj index e6f1038..12fd108 100644 --- a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj +++ b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.Dapper ExtCore.Data.Dapper icon.png diff --git a/src/ExtCore.Data.Dapper/Extension.cs b/src/ExtCore.Data.Dapper/Extension.cs index 5d1c1f4..03fc662 100644 --- a/src/ExtCore.Data.Dapper/Extension.cs +++ b/src/ExtCore.Data.Dapper/Extension.cs @@ -24,7 +24,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "7.1.3"; + public override string Version => "8.0.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj b/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj index 2c8eb1c..38cfc21 100644 --- a/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj +++ b/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data extension component. Based on the ExtCore framework. - 7.1.3 + 8.0.0 netstandard2.0 ExtCore.Data.Entities.Abstractions ExtCore.Data.Entities.Abstractions diff --git a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj index c817e2a..02d921e 100644 --- a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj +++ b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.EntityFramework.MySql ExtCore.Data.EntityFramework.MySql icon.png @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj index 40b1c44..61a346b 100644 --- a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj +++ b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.EntityFramework.PostgreSql ExtCore.Data.EntityFramework.PostgreSql icon.png @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj index 0bf3bd3..a6bb98e 100644 --- a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj +++ b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.EntityFramework.SqlServer ExtCore.Data.EntityFramework.SqlServer icon.png @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj index 4f5d828..fcb857d 100644 --- a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj +++ b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.EntityFramework.Sqlite ExtCore.Data.EntityFramework.Sqlite icon.png @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj index da7108b..0fcdfa3 100644 --- a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj +++ b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data.EntityFramework ExtCore.Data.EntityFramework icon.png @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.Data.EntityFramework/Extension.cs b/src/ExtCore.Data.EntityFramework/Extension.cs index b5a0e8c..8490d4e 100644 --- a/src/ExtCore.Data.EntityFramework/Extension.cs +++ b/src/ExtCore.Data.EntityFramework/Extension.cs @@ -24,7 +24,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "7.1.3"; + public override string Version => "8.0.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.Data/ExtCore.Data.csproj b/src/ExtCore.Data/ExtCore.Data.csproj index ff1350a..acb87fe 100644 --- a/src/ExtCore.Data/ExtCore.Data.csproj +++ b/src/ExtCore.Data/ExtCore.Data.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Data ExtCore.Data icon.png diff --git a/src/ExtCore.Data/Extension.cs b/src/ExtCore.Data/Extension.cs index 054321b..b1cc4fd 100644 --- a/src/ExtCore.Data/Extension.cs +++ b/src/ExtCore.Data/Extension.cs @@ -23,7 +23,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "7.1.3"; + public override string Version => "8.0.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.Events/ExtCore.Events.csproj b/src/ExtCore.Events/ExtCore.Events.csproj index 76ed103..b471dd1 100644 --- a/src/ExtCore.Events/ExtCore.Events.csproj +++ b/src/ExtCore.Events/ExtCore.Events.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Events extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Events ExtCore.Events icon.png diff --git a/src/ExtCore.Events/Extension.cs b/src/ExtCore.Events/Extension.cs index 37f04b9..19c8737 100644 --- a/src/ExtCore.Events/Extension.cs +++ b/src/ExtCore.Events/Extension.cs @@ -23,7 +23,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "7.1.3"; + public override string Version => "8.0.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj b/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj index dd48ed9..6fe5bb8 100644 --- a/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj +++ b/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 7.1.3 + 8.0.0 netstandard2.0 ExtCore.FileStorage.Abstractions ExtCore.FileStorage.Abstractions diff --git a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj index 0dca7f2..01a8656 100644 --- a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj +++ b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 7.1.3 + 8.0.0 netstandard2.0 8.0 ExtCore.FileStorage.Azure @@ -19,9 +19,9 @@ - - - + + + diff --git a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj index 09c0e44..9978be7 100644 --- a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj +++ b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 7.1.3 + 8.0.0 netstandard2.0 ExtCore.FileStorage.Dropbox ExtCore.FileStorage.Dropbox @@ -18,8 +18,8 @@ - - + + diff --git a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj index 954323a..571db38 100644 --- a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj +++ b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 7.1.3 + 8.0.0 netstandard2.0 ExtCore.FileStorage.FileSystem ExtCore.FileStorage.FileSystem @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj index 0122388..d70c115 100644 --- a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj +++ b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.FileStorage ExtCore.FileStorage icon.png diff --git a/src/ExtCore.FileStorage/Extension.cs b/src/ExtCore.FileStorage/Extension.cs index 8954ee9..0c5cbee 100644 --- a/src/ExtCore.FileStorage/Extension.cs +++ b/src/ExtCore.FileStorage/Extension.cs @@ -23,7 +23,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "7.1.3"; + public override string Version => "8.0.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj index 6b6370d..e177fc6 100644 --- a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj +++ b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Infrastructure ExtCore.Infrastructure icon.png diff --git a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj index aad0ec1..4e37cfd 100644 --- a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj +++ b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Mvc extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Mvc.Infrastructure ExtCore.Mvc.Infrastructure icon.png diff --git a/src/ExtCore.Mvc/ExtCore.Mvc.csproj b/src/ExtCore.Mvc/ExtCore.Mvc.csproj index d4b331c..eba39ce 100644 --- a/src/ExtCore.Mvc/ExtCore.Mvc.csproj +++ b/src/ExtCore.Mvc/ExtCore.Mvc.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Mvc extension component. Based on the ExtCore framework. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.Mvc ExtCore.Mvc icon.png @@ -18,7 +18,7 @@ - + diff --git a/src/ExtCore.Mvc/Extension.cs b/src/ExtCore.Mvc/Extension.cs index b580c0a..777f090 100644 --- a/src/ExtCore.Mvc/Extension.cs +++ b/src/ExtCore.Mvc/Extension.cs @@ -23,7 +23,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "7.1.3"; + public override string Version => "8.0.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj index 6f886c3..2b86cf4 100644 --- a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj +++ b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj @@ -4,8 +4,8 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. - 7.1.3 - net6.0 + 8.0.0 + net7.0 ExtCore.WebApplication ExtCore.WebApplication icon.png @@ -18,7 +18,7 @@ - + From 8835c39bddbcfb662db188f2f5f06558af4b90fe Mon Sep 17 00:00:00 2001 From: Dmitry Sikorsky Date: Fri, 23 Dec 2022 12:57:49 +0200 Subject: [PATCH 02/13] Fixed storage to return number of the affected records --- README.md | 2 +- .../ExtCore.Data.Abstractions.csproj | 2 +- src/ExtCore.Data.Abstractions/IStorage.cs | 4 ++-- .../ExtCore.Data.Dapper.MySql.csproj | 2 +- .../ExtCore.Data.Dapper.PostgreSql.csproj | 2 +- .../ExtCore.Data.Dapper.SqlServer.csproj | 2 +- .../ExtCore.Data.Dapper.Sqlite.csproj | 2 +- src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj | 2 +- src/ExtCore.Data.Dapper/Extension.cs | 2 +- src/ExtCore.Data.Dapper/Storage.cs | 6 ++++-- .../ExtCore.Data.Entities.Abstractions.csproj | 2 +- .../ExtCore.Data.EntityFramework.MySql.csproj | 2 +- .../ExtCore.Data.EntityFramework.PostgreSql.csproj | 2 +- .../ExtCore.Data.EntityFramework.SqlServer.csproj | 2 +- .../ExtCore.Data.EntityFramework.Sqlite.csproj | 2 +- .../ExtCore.Data.EntityFramework.csproj | 2 +- src/ExtCore.Data.EntityFramework/Extension.cs | 2 +- src/ExtCore.Data.EntityFramework/Storage.cs | 8 ++++---- src/ExtCore.Data/ExtCore.Data.csproj | 2 +- src/ExtCore.Data/Extension.cs | 2 +- src/ExtCore.Events/ExtCore.Events.csproj | 2 +- src/ExtCore.Events/Extension.cs | 2 +- .../ExtCore.FileStorage.Abstractions.csproj | 2 +- .../ExtCore.FileStorage.Azure.csproj | 2 +- .../ExtCore.FileStorage.Dropbox.csproj | 2 +- .../ExtCore.FileStorage.FileSystem.csproj | 2 +- src/ExtCore.FileStorage/ExtCore.FileStorage.csproj | 2 +- src/ExtCore.FileStorage/Extension.cs | 2 +- src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj | 2 +- .../ExtCore.Mvc.Infrastructure.csproj | 2 +- src/ExtCore.Mvc/ExtCore.Mvc.csproj | 2 +- src/ExtCore.Mvc/Extension.cs | 2 +- src/ExtCore.WebApplication/ExtCore.WebApplication.csproj | 2 +- 33 files changed, 40 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 76f5662..19134b1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ExtCore 8.0.0 +# ExtCore 8.1.0 [![Join the chat at https://gitter.im/ExtCore/ExtCore](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ExtCore/ExtCore?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj b/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj index 2335d6c..b686aff 100644 --- a/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj +++ b/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 netstandard2.0 ExtCore.Data.Abstractions ExtCore.Data.Abstractions diff --git a/src/ExtCore.Data.Abstractions/IStorage.cs b/src/ExtCore.Data.Abstractions/IStorage.cs index a5bd713..8f82b7f 100644 --- a/src/ExtCore.Data.Abstractions/IStorage.cs +++ b/src/ExtCore.Data.Abstractions/IStorage.cs @@ -27,11 +27,11 @@ public interface IStorage /// /// Commits the changes made by all the repositories. /// - void Save(); + int Save(); /// /// Asynchronously commits the changes made by all the repositories. /// - Task SaveAsync(); + Task SaveAsync(); } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj index 681bbcb..557450b 100644 --- a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj +++ b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.Dapper.MySql ExtCore.Data.Dapper.MySql diff --git a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj index 8bbddf0..b9feca0 100644 --- a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj +++ b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.Dapper.PostgreSql ExtCore.Data.Dapper.PostgreSql diff --git a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj index 497fb5a..d0732d8 100644 --- a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj +++ b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.Dapper.SqlServer ExtCore.Data.Dapper.SqlServer diff --git a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj index 94ea910..44d2357 100644 --- a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj +++ b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.Dapper.Sqlite ExtCore.Data.Dapper.Sqlite diff --git a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj index 12fd108..0994f49 100644 --- a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj +++ b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.Dapper ExtCore.Data.Dapper diff --git a/src/ExtCore.Data.Dapper/Extension.cs b/src/ExtCore.Data.Dapper/Extension.cs index 03fc662..ee95334 100644 --- a/src/ExtCore.Data.Dapper/Extension.cs +++ b/src/ExtCore.Data.Dapper/Extension.cs @@ -24,7 +24,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "8.0.0"; + public override string Version => "8.1.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.Data.Dapper/Storage.cs b/src/ExtCore.Data.Dapper/Storage.cs index 37fbab3..6744728 100644 --- a/src/ExtCore.Data.Dapper/Storage.cs +++ b/src/ExtCore.Data.Dapper/Storage.cs @@ -42,15 +42,17 @@ public TRepository GetRepository() where TRepository : IRepository /// /// Commits the changes made by all the repositories. /// - public void Save() + public int Save() { + return -1; } /// /// Asynchronously commits the changes made by all the repositories. /// - public async Task SaveAsync() + public async Task SaveAsync() { + return -1; } } } \ No newline at end of file diff --git a/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj b/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj index 38cfc21..338613f 100644 --- a/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj +++ b/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 netstandard2.0 ExtCore.Data.Entities.Abstractions ExtCore.Data.Entities.Abstractions diff --git a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj index 02d921e..1f1b6b1 100644 --- a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj +++ b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.EntityFramework.MySql ExtCore.Data.EntityFramework.MySql diff --git a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj index 61a346b..cf76bdf 100644 --- a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj +++ b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.EntityFramework.PostgreSql ExtCore.Data.EntityFramework.PostgreSql diff --git a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj index a6bb98e..b0e3b61 100644 --- a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj +++ b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.EntityFramework.SqlServer ExtCore.Data.EntityFramework.SqlServer diff --git a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj index fcb857d..d372e05 100644 --- a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj +++ b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.EntityFramework.Sqlite ExtCore.Data.EntityFramework.Sqlite diff --git a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj index 0fcdfa3..60752e9 100644 --- a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj +++ b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data.EntityFramework ExtCore.Data.EntityFramework diff --git a/src/ExtCore.Data.EntityFramework/Extension.cs b/src/ExtCore.Data.EntityFramework/Extension.cs index 8490d4e..4e996ed 100644 --- a/src/ExtCore.Data.EntityFramework/Extension.cs +++ b/src/ExtCore.Data.EntityFramework/Extension.cs @@ -24,7 +24,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "8.0.0"; + public override string Version => "8.1.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.Data.EntityFramework/Storage.cs b/src/ExtCore.Data.EntityFramework/Storage.cs index eedae26..43c866d 100644 --- a/src/ExtCore.Data.EntityFramework/Storage.cs +++ b/src/ExtCore.Data.EntityFramework/Storage.cs @@ -47,17 +47,17 @@ public TRepository GetRepository() where TRepository : IRepository /// /// Commits the changes made by all the repositories. /// - public void Save() + public int Save() { - (this.StorageContext as DbContext).SaveChanges(); + return (this.StorageContext as DbContext).SaveChanges(); } /// /// Asynchronously commits the changes made by all the repositories. /// - public async Task SaveAsync() + public async Task SaveAsync() { - await (this.StorageContext as DbContext).SaveChangesAsync(); + return await (this.StorageContext as DbContext).SaveChangesAsync(); } } } \ No newline at end of file diff --git a/src/ExtCore.Data/ExtCore.Data.csproj b/src/ExtCore.Data/ExtCore.Data.csproj index acb87fe..f35c661 100644 --- a/src/ExtCore.Data/ExtCore.Data.csproj +++ b/src/ExtCore.Data/ExtCore.Data.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Data extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Data ExtCore.Data diff --git a/src/ExtCore.Data/Extension.cs b/src/ExtCore.Data/Extension.cs index b1cc4fd..b0fe161 100644 --- a/src/ExtCore.Data/Extension.cs +++ b/src/ExtCore.Data/Extension.cs @@ -23,7 +23,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "8.0.0"; + public override string Version => "8.1.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.Events/ExtCore.Events.csproj b/src/ExtCore.Events/ExtCore.Events.csproj index b471dd1..2fb5538 100644 --- a/src/ExtCore.Events/ExtCore.Events.csproj +++ b/src/ExtCore.Events/ExtCore.Events.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2017 Dmitry Sikorsky The ExtCore.Events extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Events ExtCore.Events diff --git a/src/ExtCore.Events/Extension.cs b/src/ExtCore.Events/Extension.cs index 19c8737..d74fc53 100644 --- a/src/ExtCore.Events/Extension.cs +++ b/src/ExtCore.Events/Extension.cs @@ -23,7 +23,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "8.0.0"; + public override string Version => "8.1.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj b/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj index 6fe5bb8..a6c6125 100644 --- a/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj +++ b/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 netstandard2.0 ExtCore.FileStorage.Abstractions ExtCore.FileStorage.Abstractions diff --git a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj index 01a8656..dd07d27 100644 --- a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj +++ b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 netstandard2.0 8.0 ExtCore.FileStorage.Azure diff --git a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj index 9978be7..5f17af0 100644 --- a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj +++ b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 netstandard2.0 ExtCore.FileStorage.Dropbox ExtCore.FileStorage.Dropbox diff --git a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj index 571db38..1ced921 100644 --- a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj +++ b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 netstandard2.0 ExtCore.FileStorage.FileSystem ExtCore.FileStorage.FileSystem diff --git a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj index d70c115..a4ca170 100644 --- a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj +++ b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.FileStorage ExtCore.FileStorage diff --git a/src/ExtCore.FileStorage/Extension.cs b/src/ExtCore.FileStorage/Extension.cs index 0c5cbee..fc89843 100644 --- a/src/ExtCore.FileStorage/Extension.cs +++ b/src/ExtCore.FileStorage/Extension.cs @@ -23,7 +23,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "8.0.0"; + public override string Version => "8.1.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj index e177fc6..378a5a0 100644 --- a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj +++ b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. - 8.0.0 + 8.1.0 net7.0 ExtCore.Infrastructure ExtCore.Infrastructure diff --git a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj index 4e37cfd..7bff047 100644 --- a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj +++ b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Mvc extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Mvc.Infrastructure ExtCore.Mvc.Infrastructure diff --git a/src/ExtCore.Mvc/ExtCore.Mvc.csproj b/src/ExtCore.Mvc/ExtCore.Mvc.csproj index eba39ce..89dbf9b 100644 --- a/src/ExtCore.Mvc/ExtCore.Mvc.csproj +++ b/src/ExtCore.Mvc/ExtCore.Mvc.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky The ExtCore.Mvc extension component. Based on the ExtCore framework. - 8.0.0 + 8.1.0 net7.0 ExtCore.Mvc ExtCore.Mvc diff --git a/src/ExtCore.Mvc/Extension.cs b/src/ExtCore.Mvc/Extension.cs index 777f090..932b886 100644 --- a/src/ExtCore.Mvc/Extension.cs +++ b/src/ExtCore.Mvc/Extension.cs @@ -23,7 +23,7 @@ public class Extension : ExtensionBase /// /// Gets the version of the extension. /// - public override string Version => "8.0.0"; + public override string Version => "8.1.0"; /// /// Gets the authors of the extension (separated by commas). diff --git a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj index 2b86cf4..2ea9eb9 100644 --- a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj +++ b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj @@ -4,7 +4,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. - 8.0.0 + 8.1.0 net7.0 ExtCore.WebApplication ExtCore.WebApplication From d0159e6dbcb3e401d573efeed67a2cf3759a2408 Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Fri, 23 Dec 2022 15:09:49 +0300 Subject: [PATCH 03/13] Use a MSBuild build project for common props --- common.props | 17 +++++++++++++++++ .../ExtCore.Data.Abstractions.csproj | 11 +---------- .../ExtCore.Data.Dapper.MySql.csproj | 11 +---------- .../ExtCore.Data.Dapper.PostgreSql.csproj | 11 +---------- .../ExtCore.Data.Dapper.SqlServer.csproj | 11 +---------- .../ExtCore.Data.Dapper.Sqlite.csproj | 11 +---------- .../ExtCore.Data.Dapper.csproj | 11 +---------- .../ExtCore.Data.Entities.Abstractions.csproj | 11 +---------- .../ExtCore.Data.EntityFramework.MySql.csproj | 11 +---------- ...tCore.Data.EntityFramework.PostgreSql.csproj | 11 +---------- ...xtCore.Data.EntityFramework.SqlServer.csproj | 11 +---------- .../ExtCore.Data.EntityFramework.Sqlite.csproj | 11 +---------- .../ExtCore.Data.EntityFramework.csproj | 11 +---------- src/ExtCore.Data/ExtCore.Data.csproj | 11 +---------- src/ExtCore.Events/ExtCore.Events.csproj | 11 +---------- .../ExtCore.FileStorage.Abstractions.csproj | 11 +---------- .../ExtCore.FileStorage.Azure.csproj | 12 +----------- .../ExtCore.FileStorage.Dropbox.csproj | 11 +---------- .../ExtCore.FileStorage.FileSystem.csproj | 11 +---------- .../ExtCore.FileStorage.csproj | 11 +---------- .../ExtCore.Infrastructure.csproj | 11 +---------- .../ExtCore.Mvc.Infrastructure.csproj | 11 +---------- src/ExtCore.Mvc/ExtCore.Mvc.csproj | 11 +---------- .../ExtCore.WebApplication.csproj | 11 +---------- 24 files changed, 40 insertions(+), 231 deletions(-) create mode 100644 common.props diff --git a/common.props b/common.props new file mode 100644 index 0000000..8e498ed --- /dev/null +++ b/common.props @@ -0,0 +1,17 @@ + + + + Dmitry Sikorsky + Copyright © 2015 Dmitry Sikorsky + 8.1.0 + 8.0 + icon.png + https://extcore.net/ + Apache-2.0 + + + + + + + \ No newline at end of file diff --git a/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj b/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj index b686aff..b16ff48 100644 --- a/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj +++ b/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj @@ -1,20 +1,11 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky The ExtCore.Data extension component. Based on the ExtCore framework. - 8.1.0 netstandard2.0 ExtCore.Data.Abstractions ExtCore.Data.Abstractions - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj index 557450b..5d40a97 100644 --- a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj +++ b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.Dapper.MySql ExtCore.Data.Dapper.MySql - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj index b9feca0..dc16eff 100644 --- a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj +++ b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.Dapper.PostgreSql ExtCore.Data.Dapper.PostgreSql - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj index d0732d8..b63d7f9 100644 --- a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj +++ b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.Dapper.SqlServer ExtCore.Data.Dapper.SqlServer - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj index 44d2357..6d6e2da 100644 --- a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj +++ b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.Dapper.Sqlite ExtCore.Data.Dapper.Sqlite - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj index 0994f49..ebdce7c 100644 --- a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj +++ b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.Dapper ExtCore.Data.Dapper - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj b/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj index 338613f..4cf297d 100644 --- a/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj +++ b/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj @@ -1,20 +1,11 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky The ExtCore.Data extension component. Based on the ExtCore framework. - 8.1.0 netstandard2.0 ExtCore.Data.Entities.Abstractions ExtCore.Data.Entities.Abstractions - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj index 1f1b6b1..750c8f0 100644 --- a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj +++ b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.EntityFramework.MySql ExtCore.Data.EntityFramework.MySql - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj index cf76bdf..94a7c08 100644 --- a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj +++ b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.EntityFramework.PostgreSql ExtCore.Data.EntityFramework.PostgreSql - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj index b0e3b61..88c0cfd 100644 --- a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj +++ b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.EntityFramework.SqlServer ExtCore.Data.EntityFramework.SqlServer - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj index d372e05..0d593c2 100644 --- a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj +++ b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.EntityFramework.Sqlite ExtCore.Data.EntityFramework.Sqlite - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj index 60752e9..948ae05 100644 --- a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj +++ b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2017 Dmitry Sikorsky The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data.EntityFramework ExtCore.Data.EntityFramework - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Data/ExtCore.Data.csproj b/src/ExtCore.Data/ExtCore.Data.csproj index f35c661..e9f4774 100644 --- a/src/ExtCore.Data/ExtCore.Data.csproj +++ b/src/ExtCore.Data/ExtCore.Data.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky The ExtCore.Data extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Data ExtCore.Data - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Events/ExtCore.Events.csproj b/src/ExtCore.Events/ExtCore.Events.csproj index 2fb5538..3036ba1 100644 --- a/src/ExtCore.Events/ExtCore.Events.csproj +++ b/src/ExtCore.Events/ExtCore.Events.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2017 Dmitry Sikorsky The ExtCore.Events extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Events ExtCore.Events - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj b/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj index a6c6125..b85c805 100644 --- a/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj +++ b/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj @@ -1,20 +1,11 @@  + - Dmitry Sikorsky - Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.1.0 netstandard2.0 ExtCore.FileStorage.Abstractions ExtCore.FileStorage.Abstractions - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj index dd07d27..0440247 100644 --- a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj +++ b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj @@ -1,23 +1,13 @@ + - Dmitry Sikorsky - Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.1.0 netstandard2.0 - 8.0 ExtCore.FileStorage.Azure ExtCore.FileStorage.Azure - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj index 5f17af0..3c64647 100644 --- a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj +++ b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.1.0 netstandard2.0 ExtCore.FileStorage.Dropbox ExtCore.FileStorage.Dropbox - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj index 1ced921..53580b0 100644 --- a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj +++ b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.1.0 netstandard2.0 ExtCore.FileStorage.FileSystem ExtCore.FileStorage.FileSystem - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj index a4ca170..3762844 100644 --- a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj +++ b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2018 Dmitry Sikorsky The ExtCore.FileStorage extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.FileStorage ExtCore.FileStorage - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj index 378a5a0..eb3e27c 100644 --- a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj +++ b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. - 8.1.0 net7.0 ExtCore.Infrastructure ExtCore.Infrastructure - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj index 7bff047..0eb7813 100644 --- a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj +++ b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky The ExtCore.Mvc extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Mvc.Infrastructure ExtCore.Mvc.Infrastructure - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.Mvc/ExtCore.Mvc.csproj b/src/ExtCore.Mvc/ExtCore.Mvc.csproj index 89dbf9b..3ff78c1 100644 --- a/src/ExtCore.Mvc/ExtCore.Mvc.csproj +++ b/src/ExtCore.Mvc/ExtCore.Mvc.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky The ExtCore.Mvc extension component. Based on the ExtCore framework. - 8.1.0 net7.0 ExtCore.Mvc ExtCore.Mvc - icon.png - https://extcore.net/ - Apache-2.0 - - - - diff --git a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj index 2ea9eb9..af8bc5c 100644 --- a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj +++ b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj @@ -1,22 +1,13 @@  + - Dmitry Sikorsky - Copyright © 2015 Dmitry Sikorsky Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. - 8.1.0 net7.0 ExtCore.WebApplication ExtCore.WebApplication - icon.png - https://extcore.net/ - Apache-2.0 - - - - From 8ae20a1bce59bdd9260df73eb853322afa2fad3d Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Fri, 23 Dec 2022 20:45:14 +0300 Subject: [PATCH 04/13] Use PackageIconUrl instead of PackageIcon --- common.props | 6 +----- src/ExtCore.Data.Abstractions/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data.Dapper.MySql/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data.Dapper.PostgreSql/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data.Dapper.SqlServer/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data.Dapper.Sqlite/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data.Dapper/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data.Entities.Abstractions/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data.EntityFramework.MySql/icon.png | Bin 3149 -> 0 bytes .../icon.png | Bin 3149 -> 0 bytes .../icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data.EntityFramework.Sqlite/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data.EntityFramework/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Data/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Events/icon.png | Bin 3149 -> 0 bytes src/ExtCore.FileStorage.Abstractions/icon.png | Bin 3149 -> 0 bytes src/ExtCore.FileStorage.Azure/icon.png | Bin 3149 -> 0 bytes src/ExtCore.FileStorage.Dropbox/icon.png | Bin 3149 -> 0 bytes src/ExtCore.FileStorage.FileSystem/icon.png | Bin 3149 -> 0 bytes src/ExtCore.FileStorage/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Infrastructure/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Mvc.Infrastructure/icon.png | Bin 3149 -> 0 bytes src/ExtCore.Mvc/icon.png | Bin 3149 -> 0 bytes src/ExtCore.WebApplication/icon.png | Bin 3149 -> 0 bytes 24 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 src/ExtCore.Data.Abstractions/icon.png delete mode 100644 src/ExtCore.Data.Dapper.MySql/icon.png delete mode 100644 src/ExtCore.Data.Dapper.PostgreSql/icon.png delete mode 100644 src/ExtCore.Data.Dapper.SqlServer/icon.png delete mode 100644 src/ExtCore.Data.Dapper.Sqlite/icon.png delete mode 100644 src/ExtCore.Data.Dapper/icon.png delete mode 100644 src/ExtCore.Data.Entities.Abstractions/icon.png delete mode 100644 src/ExtCore.Data.EntityFramework.MySql/icon.png delete mode 100644 src/ExtCore.Data.EntityFramework.PostgreSql/icon.png delete mode 100644 src/ExtCore.Data.EntityFramework.SqlServer/icon.png delete mode 100644 src/ExtCore.Data.EntityFramework.Sqlite/icon.png delete mode 100644 src/ExtCore.Data.EntityFramework/icon.png delete mode 100644 src/ExtCore.Data/icon.png delete mode 100644 src/ExtCore.Events/icon.png delete mode 100644 src/ExtCore.FileStorage.Abstractions/icon.png delete mode 100644 src/ExtCore.FileStorage.Azure/icon.png delete mode 100644 src/ExtCore.FileStorage.Dropbox/icon.png delete mode 100644 src/ExtCore.FileStorage.FileSystem/icon.png delete mode 100644 src/ExtCore.FileStorage/icon.png delete mode 100644 src/ExtCore.Infrastructure/icon.png delete mode 100644 src/ExtCore.Mvc.Infrastructure/icon.png delete mode 100644 src/ExtCore.Mvc/icon.png delete mode 100644 src/ExtCore.WebApplication/icon.png diff --git a/common.props b/common.props index 8e498ed..f7351b6 100644 --- a/common.props +++ b/common.props @@ -5,13 +5,9 @@ Copyright © 2015 Dmitry Sikorsky 8.1.0 8.0 - icon.png + https://extcore.net/images/extcore_framework_logo_s.png https://extcore.net/ Apache-2.0 - - - - \ No newline at end of file diff --git a/src/ExtCore.Data.Abstractions/icon.png b/src/ExtCore.Data.Abstractions/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.Dapper.MySql/icon.png b/src/ExtCore.Data.Dapper.MySql/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.Dapper.PostgreSql/icon.png b/src/ExtCore.Data.Dapper.PostgreSql/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.Dapper.SqlServer/icon.png b/src/ExtCore.Data.Dapper.SqlServer/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.Dapper.Sqlite/icon.png b/src/ExtCore.Data.Dapper.Sqlite/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.Dapper/icon.png b/src/ExtCore.Data.Dapper/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.Entities.Abstractions/icon.png b/src/ExtCore.Data.Entities.Abstractions/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.EntityFramework.MySql/icon.png b/src/ExtCore.Data.EntityFramework.MySql/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.EntityFramework.PostgreSql/icon.png b/src/ExtCore.Data.EntityFramework.PostgreSql/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.EntityFramework.SqlServer/icon.png b/src/ExtCore.Data.EntityFramework.SqlServer/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.EntityFramework.Sqlite/icon.png b/src/ExtCore.Data.EntityFramework.Sqlite/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data.EntityFramework/icon.png b/src/ExtCore.Data.EntityFramework/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Data/icon.png b/src/ExtCore.Data/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Events/icon.png b/src/ExtCore.Events/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.FileStorage.Abstractions/icon.png b/src/ExtCore.FileStorage.Abstractions/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.FileStorage.Azure/icon.png b/src/ExtCore.FileStorage.Azure/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.FileStorage.Dropbox/icon.png b/src/ExtCore.FileStorage.Dropbox/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.FileStorage.FileSystem/icon.png b/src/ExtCore.FileStorage.FileSystem/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.FileStorage/icon.png b/src/ExtCore.FileStorage/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Infrastructure/icon.png b/src/ExtCore.Infrastructure/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Mvc.Infrastructure/icon.png b/src/ExtCore.Mvc.Infrastructure/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.Mvc/icon.png b/src/ExtCore.Mvc/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 diff --git a/src/ExtCore.WebApplication/icon.png b/src/ExtCore.WebApplication/icon.png deleted file mode 100644 index 658aadfa4b42dc9573b7867b99b9d5a0ce54f25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 From 9e47f8038da2fb2c7ba5f7b1cc1ad6f0a0821651 Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Fri, 23 Dec 2022 20:58:54 +0300 Subject: [PATCH 05/13] Add repository props & modify some props --- common.props | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/common.props b/common.props index f7351b6..8ffe6ba 100644 --- a/common.props +++ b/common.props @@ -4,10 +4,12 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky 8.1.0 - 8.0 + latest https://extcore.net/images/extcore_framework_logo_s.png - https://extcore.net/ + https://extcore.net Apache-2.0 + git + https://github.com/ExtCore/ExtCore \ No newline at end of file From ee5393adfb359aa8a68ded6a4311e967db722390 Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Fri, 23 Dec 2022 21:09:28 +0300 Subject: [PATCH 06/13] Use Source Link --- common.props | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/common.props b/common.props index 8ffe6ba..24c1520 100644 --- a/common.props +++ b/common.props @@ -10,6 +10,16 @@ Apache-2.0 git https://github.com/ExtCore/ExtCore + + + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + + + all + runtime; build; native; contentfiles; analyzers + + + \ No newline at end of file From f46d29a9b013b446ae67e3115a7cfbdab22e58f0 Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Mon, 26 Dec 2022 11:49:36 +0300 Subject: [PATCH 07/13] Revert "Use Source Link" This reverts commit ee5393adfb359aa8a68ded6a4311e967db722390. --- common.props | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/common.props b/common.props index 24c1520..8ffe6ba 100644 --- a/common.props +++ b/common.props @@ -10,16 +10,6 @@ Apache-2.0 git https://github.com/ExtCore/ExtCore - - - $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - - - all - runtime; build; native; contentfiles; analyzers - - - \ No newline at end of file From 2b8bf74de0e922593189cb223c39e68fce056882 Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Mon, 26 Dec 2022 11:50:22 +0300 Subject: [PATCH 08/13] Revert "Add repository props & modify some props" This reverts commit 9e47f8038da2fb2c7ba5f7b1cc1ad6f0a0821651. --- common.props | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/common.props b/common.props index 8ffe6ba..f7351b6 100644 --- a/common.props +++ b/common.props @@ -4,12 +4,10 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky 8.1.0 - latest + 8.0 https://extcore.net/images/extcore_framework_logo_s.png - https://extcore.net + https://extcore.net/ Apache-2.0 - git - https://github.com/ExtCore/ExtCore \ No newline at end of file From 3e122c5dde06d409533e0d775a2b16c7b80c76b6 Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Mon, 26 Dec 2022 11:50:41 +0300 Subject: [PATCH 09/13] Revert "Use PackageIconUrl instead of PackageIcon" This reverts commit 8ae20a1bce59bdd9260df73eb853322afa2fad3d. --- common.props | 6 +++++- src/ExtCore.Data.Abstractions/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data.Dapper.MySql/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data.Dapper.PostgreSql/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data.Dapper.SqlServer/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data.Dapper.Sqlite/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data.Dapper/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data.Entities.Abstractions/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data.EntityFramework.MySql/icon.png | Bin 0 -> 3149 bytes .../icon.png | Bin 0 -> 3149 bytes .../icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data.EntityFramework.Sqlite/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data.EntityFramework/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Data/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Events/icon.png | Bin 0 -> 3149 bytes src/ExtCore.FileStorage.Abstractions/icon.png | Bin 0 -> 3149 bytes src/ExtCore.FileStorage.Azure/icon.png | Bin 0 -> 3149 bytes src/ExtCore.FileStorage.Dropbox/icon.png | Bin 0 -> 3149 bytes src/ExtCore.FileStorage.FileSystem/icon.png | Bin 0 -> 3149 bytes src/ExtCore.FileStorage/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Infrastructure/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Mvc.Infrastructure/icon.png | Bin 0 -> 3149 bytes src/ExtCore.Mvc/icon.png | Bin 0 -> 3149 bytes src/ExtCore.WebApplication/icon.png | Bin 0 -> 3149 bytes 24 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 src/ExtCore.Data.Abstractions/icon.png create mode 100644 src/ExtCore.Data.Dapper.MySql/icon.png create mode 100644 src/ExtCore.Data.Dapper.PostgreSql/icon.png create mode 100644 src/ExtCore.Data.Dapper.SqlServer/icon.png create mode 100644 src/ExtCore.Data.Dapper.Sqlite/icon.png create mode 100644 src/ExtCore.Data.Dapper/icon.png create mode 100644 src/ExtCore.Data.Entities.Abstractions/icon.png create mode 100644 src/ExtCore.Data.EntityFramework.MySql/icon.png create mode 100644 src/ExtCore.Data.EntityFramework.PostgreSql/icon.png create mode 100644 src/ExtCore.Data.EntityFramework.SqlServer/icon.png create mode 100644 src/ExtCore.Data.EntityFramework.Sqlite/icon.png create mode 100644 src/ExtCore.Data.EntityFramework/icon.png create mode 100644 src/ExtCore.Data/icon.png create mode 100644 src/ExtCore.Events/icon.png create mode 100644 src/ExtCore.FileStorage.Abstractions/icon.png create mode 100644 src/ExtCore.FileStorage.Azure/icon.png create mode 100644 src/ExtCore.FileStorage.Dropbox/icon.png create mode 100644 src/ExtCore.FileStorage.FileSystem/icon.png create mode 100644 src/ExtCore.FileStorage/icon.png create mode 100644 src/ExtCore.Infrastructure/icon.png create mode 100644 src/ExtCore.Mvc.Infrastructure/icon.png create mode 100644 src/ExtCore.Mvc/icon.png create mode 100644 src/ExtCore.WebApplication/icon.png diff --git a/common.props b/common.props index f7351b6..8e498ed 100644 --- a/common.props +++ b/common.props @@ -5,9 +5,13 @@ Copyright © 2015 Dmitry Sikorsky 8.1.0 8.0 - https://extcore.net/images/extcore_framework_logo_s.png + icon.png https://extcore.net/ Apache-2.0 + + + + \ No newline at end of file diff --git a/src/ExtCore.Data.Abstractions/icon.png b/src/ExtCore.Data.Abstractions/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.Dapper.MySql/icon.png b/src/ExtCore.Data.Dapper.MySql/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.Dapper.PostgreSql/icon.png b/src/ExtCore.Data.Dapper.PostgreSql/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.Dapper.SqlServer/icon.png b/src/ExtCore.Data.Dapper.SqlServer/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.Dapper.Sqlite/icon.png b/src/ExtCore.Data.Dapper.Sqlite/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.Dapper/icon.png b/src/ExtCore.Data.Dapper/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.Entities.Abstractions/icon.png b/src/ExtCore.Data.Entities.Abstractions/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.EntityFramework.MySql/icon.png b/src/ExtCore.Data.EntityFramework.MySql/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.EntityFramework.PostgreSql/icon.png b/src/ExtCore.Data.EntityFramework.PostgreSql/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.EntityFramework.SqlServer/icon.png b/src/ExtCore.Data.EntityFramework.SqlServer/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.EntityFramework.Sqlite/icon.png b/src/ExtCore.Data.EntityFramework.Sqlite/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data.EntityFramework/icon.png b/src/ExtCore.Data.EntityFramework/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Data/icon.png b/src/ExtCore.Data/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Events/icon.png b/src/ExtCore.Events/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.FileStorage.Abstractions/icon.png b/src/ExtCore.FileStorage.Abstractions/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.FileStorage.Azure/icon.png b/src/ExtCore.FileStorage.Azure/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.FileStorage.Dropbox/icon.png b/src/ExtCore.FileStorage.Dropbox/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.FileStorage.FileSystem/icon.png b/src/ExtCore.FileStorage.FileSystem/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.FileStorage/icon.png b/src/ExtCore.FileStorage/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Infrastructure/icon.png b/src/ExtCore.Infrastructure/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Mvc.Infrastructure/icon.png b/src/ExtCore.Mvc.Infrastructure/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.Mvc/icon.png b/src/ExtCore.Mvc/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 diff --git a/src/ExtCore.WebApplication/icon.png b/src/ExtCore.WebApplication/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..658aadfa4b42dc9573b7867b99b9d5a0ce54f25b GIT binary patch literal 3149 zcmaJ@c|4SB8-8XGp$_Q`ZKr8uEoR0tjw#D9GnVX2Mu#$Hh8bfPGb2mMgM1*g2s`LHv^}WCMeV^rbUDtg-&wahm?>*$=WV1qktvmo= zg`F+lP0|XN9yzGw?cnn%OVX?n5J&=dPJkec%%cGumE%u?+p)-jG&dTV8WD1bwjBT| z1jBl^A(P-rw9gV9GD8DlW$t#AVr+5m}?+!#Hy5!M)kH86pHyAYCS zJZb>e4Nv?QOENM;&;(C&HuJdk_|(KletK=K5A)6-+_*f{~yX? z{Xp{tZnS^%{hz{oj|eUe=|vr&l)GdF7FQA(PvbH6(x^lphXwz-WGv(7 zxmf*F?;Dr;^IWWd%0)_&K`s^czY6_*O5&cS?ho5a20x5XV@ur5li2#cbK+e9?|r@LKAvjVr@J)_GdG{;$=lJP8>E_(9}=O|Zi3riHG^2KES=MlwCiFBj(*9W z5w%(w@0w>mGcW1y^ zwh9e#x$3UVWm$sMS@{)5Es?;(W=D6|OCeB-weLA%sSfB)4y3_4qLfgSPp3)O0!usB z%G^9Fl_{;g3bQV5dce>0e2~BN7r@mBGRn#G4=rjiCpIdAGUU^PA|6yMwT_(J98leP z)BRa63=+LUKiGAp@DTonQLEA~@z+!y41UyZX6}qT2^Etz1>0_gsq=85c3dSob{ zEdhLe!K&B0u(-M2}bCn<$* zDy>lNs%WOW%X}E@EkFk4w%owAho;|?3u22OqGEJ{-1D{0y_zLUy@P_--&bj~-1B|p zW}?C@@MHS+HAszR;%WmUH``OIR%m$oUUnwh;g}j`2`QDDYi%B*SViOEJ}})o zi&FZYhS_wrecsxIzQ0l>_Mvn|Rw$@EA;QZRnt;pf2=eaOg;Y_@sb$#uB=Nc8#AXs< z_Wh_nzI-)qk2pqzaX4KR{ah9z)UZ!F4etw5B_ub$%C)8kW|aJOw0Xs&^Y)#&((4rt zizZ$^MGz@st=FP}m{ly|+rr0kn;)59?Hu4H&+jCunJ)U)nD_UL?%n@rO2|O%z??35 zBo7hd5y}P(<xPMjsamw| zK2o{poo<=x0TUtzG!NYI@vPNJfVH(o=dZfC zttn?pjlJzZ;e8{xDfu(ASGAP5YyM{fuA0ySyx6yX)mkVM%XpYF@m05eo?M*+oQk$`-tX<=*${HZK~Cpr25{c38I$^ z_7!~*XWJarF1n$wQHBqn_FwmIeL_8fr?d8IRh0~|%otd>Ub64}F+(RTdsiJkdVT~d z7GCR#hmVYm9Q1vtU>3$<5Bp_JejI%cxrrMG*Yt0PtUt@^`4z%-2%&OgnH@~Rds8Mj zo`iy?IA~gTJZyO(dp3B_J%iyWJ!`a7iC^6Hndw^fqb=`(+|9OE-!v}#BW`2m3Fi#o zYD$HNF!TJg_I6h<-M;MfPpbPy^Rp^Z_g%wCx6m2CN%@%@D`Ya6)AYrtd5mw}CwKND zOuf{f3WO8*0Pl2%8Xp!ArSo4MW8np@m3t~WbsQB_AmD*)iR09>(QRRW)yZkrzwqs( zXm2-3E4C_E>I~Jm7aG@Xk!d4qx}^Kb}z3xYyri`KY{DzJ9yOMBU>tI1k7 za3HV?zB)A3BR(=-`c;EeP;dH_)0Wx1vmvq{3~WErsyD{gmfBs}Q0cC&21;(28*%@hj8&FnalR(h3u@XH}$0zTbXov;<$~k%!j_Z+S+hEaX~@C zv{qEeZ3DSaDSCP*g7t&G&_Bzs_N2yRnj()ZghNR z$H*9VYyo@GR{_8kW4GOkg~=^oJ?;-ffo)jW)wgZ_yDjFr_67zPXexBdfLAd>$eO7) z^DOxd5L8hiJ|@|tbRtn|!;G(;Zp#ZU}Ko;$KGmV{u0*U*No4j6228~b` z(UhgxnzHpl?-Ev8U}{C;N?6nAyWx3t&={oD-W{U}9Kop$X}>3T8=#7ysdt0TOXY1D QOF#H_1Sfo{m0!$%0K4WuRsaA1 literal 0 HcmV?d00001 From e5944e91965dbea422f95e364e99b4158017f065 Mon Sep 17 00:00:00 2001 From: iyilm4z Date: Mon, 26 Dec 2022 16:22:40 +0300 Subject: [PATCH 10/13] Use the latest csharp version and implement its file-scoped namespaces feature --- common.props | 6 +- src/ExtCore.Data.Abstractions/IRepository.cs | 19 +- src/ExtCore.Data.Abstractions/IStorage.cs | 49 +- .../IStorageContext.cs | 15 +- .../StorageContext.cs | 23 +- .../StorageContext.cs | 23 +- .../StorageContext.cs | 23 +- .../StorageContext.cs | 23 +- .../Actions/AddStorageContextAction.cs | 55 +- src/ExtCore.Data.Dapper/Extension.cs | 43 +- src/ExtCore.Data.Dapper/RepositoryBase.cs | 31 +- src/ExtCore.Data.Dapper/Storage.cs | 89 ++- src/ExtCore.Data.Dapper/StorageContextBase.cs | 33 +- .../StorageContextOptions.cs | 17 +- .../IEntity.cs | 13 +- .../StorageContext.cs | 45 +- .../StorageContext.cs | 45 +- .../StorageContext.cs | 45 +- .../StorageContext.cs | 49 +- .../Actions/AddStorageContextAction.cs | 55 +- .../DesignTimeStorageContextFactoryBase.cs | 61 +- src/ExtCore.Data.EntityFramework/Extension.cs | 43 +- .../Extensions/StorageContextExtensions.cs | 27 +- .../IEntityRegistrar.cs | 19 +- .../RepositoryBase.cs | 31 +- src/ExtCore.Data.EntityFramework/Storage.cs | 95 ++- .../StorageContextBase.cs | 53 +- .../StorageContextOptions.cs | 25 +- src/ExtCore.Data/Actions/AddStorageAction.cs | 55 +- src/ExtCore.Data/Extension.cs | 41 +- src/ExtCore.Events/Event.cs | 155 ++-- src/ExtCore.Events/Extension.cs | 41 +- src/ExtCore.Events/IEventHandler.cs | 137 ++-- .../Exceptions/AccessDeniedException.cs | 19 +- .../Exceptions/DirectoryNotFoundException.cs | 19 +- .../Exceptions/FileNotFoundException.cs | 19 +- .../Exceptions/FileStorageException.cs | 19 +- .../Exceptions/PathTooLongException.cs | 19 +- .../FileStorageOptions.cs | 41 +- .../IDirectoryProxy.cs | 119 ++- .../IFileProxy.cs | 173 +++-- .../IFileStorage.cs | 35 +- .../DirectoryProxy.cs | 333 ++++---- src/ExtCore.FileStorage.Azure/FileProxy.cs | 411 +++++----- src/ExtCore.FileStorage.Azure/FileStorage.cs | 67 +- src/ExtCore.FileStorage.Azure/RelativeUrl.cs | 21 +- .../DirectoryProxy.cs | 345 +++++---- src/ExtCore.FileStorage.Dropbox/FileProxy.cs | 425 +++++----- .../FileStorage.cs | 67 +- .../RelativeUrl.cs | 21 +- .../AbsolutePath.cs | 21 +- .../DirectoryProxy.cs | 379 +++++---- .../FileProxy.cs | 731 +++++++++--------- .../FileStorage.cs | 63 +- .../Actions/AddFileStorageAction.cs | 55 +- src/ExtCore.FileStorage/Extension.cs | 41 +- .../Actions/IConfigureAction.cs | 39 +- .../Actions/IConfigureServicesAction.cs | 39 +- src/ExtCore.Infrastructure/ExtensionBase.cs | 49 +- .../ExtensionManager.cs | 451 ++++++----- src/ExtCore.Infrastructure/IExtension.cs | 49 +- .../Actions/IAddMvcAction.cs | 39 +- .../Actions/IUseEndpointsAction.cs | 39 +- src/ExtCore.Mvc/Actions/AddMvcAction.cs | 57 +- .../Actions/AddStaticFilesAction.cs | 65 +- src/ExtCore.Mvc/Actions/UseEndpointsAction.cs | 59 +- src/ExtCore.Mvc/Actions/UseRoutingAction.cs | 43 +- .../Actions/UseStaticFilesAction.cs | 47 +- src/ExtCore.Mvc/Extension.cs | 41 +- .../DefaultAssemblyProvider.cs | 201 +++-- .../ApplicationBuilderExtensions.cs | 35 +- .../IAssemblyProvider.cs | 35 +- 72 files changed, 3073 insertions(+), 3142 deletions(-) diff --git a/common.props b/common.props index 8e498ed..ba9fe54 100644 --- a/common.props +++ b/common.props @@ -4,10 +4,12 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky 8.1.0 - 8.0 + latest icon.png - https://extcore.net/ + https://extcore.net Apache-2.0 + git + https://github.com/ExtCore/ExtCore diff --git a/src/ExtCore.Data.Abstractions/IRepository.cs b/src/ExtCore.Data.Abstractions/IRepository.cs index aa65ad8..afee570 100644 --- a/src/ExtCore.Data.Abstractions/IRepository.cs +++ b/src/ExtCore.Data.Abstractions/IRepository.cs @@ -1,17 +1,16 @@ // Copyright © 2015 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.Data.Abstractions +namespace ExtCore.Data.Abstractions; + +/// +/// Describes a repository for working with the underlying storage context. +/// +public interface IRepository { /// - /// Describes a repository for working with the underlying storage context. + /// Sets the storage context to work with. /// - public interface IRepository - { - /// - /// Sets the storage context to work with. - /// - /// The storage context to set. - void SetStorageContext(IStorageContext storageContext); - } + /// The storage context to set. + void SetStorageContext(IStorageContext storageContext); } \ No newline at end of file diff --git a/src/ExtCore.Data.Abstractions/IStorage.cs b/src/ExtCore.Data.Abstractions/IStorage.cs index 8f82b7f..778382e 100644 --- a/src/ExtCore.Data.Abstractions/IStorage.cs +++ b/src/ExtCore.Data.Abstractions/IStorage.cs @@ -3,35 +3,34 @@ using System.Threading.Tasks; -namespace ExtCore.Data.Abstractions +namespace ExtCore.Data.Abstractions; + +/// +/// Describes a storage that is implementation of the Unit of Work design pattern with the mechanism +/// of getting the repositories to work with the underlying storage context and committing the changes +/// made by all the repositories. +/// +public interface IStorage { /// - /// Describes a storage that is implementation of the Unit of Work design pattern with the mechanism - /// of getting the repositories to work with the underlying storage context and committing the changes - /// made by all the repositories. + /// Gets the underlying storage context used by this storage. /// - public interface IStorage - { - /// - /// Gets the underlying storage context used by this storage. - /// - IStorageContext StorageContext { get; } + IStorageContext StorageContext { get; } - /// - /// Gets a repository of the given type. - /// - /// The type parameter to find implementation of. - /// - T GetRepository() where T: IRepository; + /// + /// Gets a repository of the given type. + /// + /// The type parameter to find implementation of. + /// + T GetRepository() where T: IRepository; - /// - /// Commits the changes made by all the repositories. - /// - int Save(); + /// + /// Commits the changes made by all the repositories. + /// + int Save(); - /// - /// Asynchronously commits the changes made by all the repositories. - /// - Task SaveAsync(); - } + /// + /// Asynchronously commits the changes made by all the repositories. + /// + Task SaveAsync(); } \ No newline at end of file diff --git a/src/ExtCore.Data.Abstractions/IStorageContext.cs b/src/ExtCore.Data.Abstractions/IStorageContext.cs index b9aa6f2..89055ad 100644 --- a/src/ExtCore.Data.Abstractions/IStorageContext.cs +++ b/src/ExtCore.Data.Abstractions/IStorageContext.cs @@ -1,13 +1,12 @@ // Copyright © 2015 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.Data.Abstractions +namespace ExtCore.Data.Abstractions; + +/// +/// Describes a storage context that must be shared among all the repositories. Storage context +/// represents concrete storage (for example, SQLite database). +/// +public interface IStorageContext { - /// - /// Describes a storage context that must be shared among all the repositories. Storage context - /// represents concrete storage (for example, SQLite database). - /// - public interface IStorageContext - { - } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper.MySql/StorageContext.cs b/src/ExtCore.Data.Dapper.MySql/StorageContext.cs index c02edcd..9ede0bb 100644 --- a/src/ExtCore.Data.Dapper.MySql/StorageContext.cs +++ b/src/ExtCore.Data.Dapper.MySql/StorageContext.cs @@ -3,21 +3,20 @@ using Microsoft.Extensions.Options; -namespace ExtCore.Data.Dapper.MySql +namespace ExtCore.Data.Dapper.MySql; + +/// +/// Implements the IStorageContext interface and represents MySQL database +/// with the Dapper as the ORM. +/// +public class StorageContext : StorageContextBase { /// - /// Implements the IStorageContext interface and represents MySQL database - /// with the Dapper as the ORM. + /// Initializes a new instance of the StorageContext class. /// - public class StorageContext : StorageContextBase + /// The options that are used to connect to the MySQL database. + public StorageContext(IOptions options) + : base(options) { - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The options that are used to connect to the MySQL database. - public StorageContext(IOptions options) - : base(options) - { - } } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper.PostgreSql/StorageContext.cs b/src/ExtCore.Data.Dapper.PostgreSql/StorageContext.cs index 64bb69e..0764bca 100644 --- a/src/ExtCore.Data.Dapper.PostgreSql/StorageContext.cs +++ b/src/ExtCore.Data.Dapper.PostgreSql/StorageContext.cs @@ -3,21 +3,20 @@ using Microsoft.Extensions.Options; -namespace ExtCore.Data.Dapper.PostgreSql +namespace ExtCore.Data.Dapper.PostgreSql; + +/// +/// Implements the IStorageContext interface and represents PostgreSQL database +/// with the Dapper as the ORM. +/// +public class StorageContext : StorageContextBase { /// - /// Implements the IStorageContext interface and represents PostgreSQL database - /// with the Dapper as the ORM. + /// Initializes a new instance of the StorageContext class. /// - public class StorageContext : StorageContextBase + /// The options that are used to connect to the PostgreSQL database. + public StorageContext(IOptions options) + : base(options) { - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The options that are used to connect to the PostgreSQL database. - public StorageContext(IOptions options) - : base(options) - { - } } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper.SqlServer/StorageContext.cs b/src/ExtCore.Data.Dapper.SqlServer/StorageContext.cs index ef7d86f..afcafc3 100644 --- a/src/ExtCore.Data.Dapper.SqlServer/StorageContext.cs +++ b/src/ExtCore.Data.Dapper.SqlServer/StorageContext.cs @@ -3,21 +3,20 @@ using Microsoft.Extensions.Options; -namespace ExtCore.Data.Dapper.SqlServer +namespace ExtCore.Data.Dapper.SqlServer; + +/// +/// Implements the IStorageContext interface and represents SQL Server database +/// with the Dapper as the ORM. +/// +public class StorageContext : StorageContextBase { /// - /// Implements the IStorageContext interface and represents SQL Server database - /// with the Dapper as the ORM. + /// Initializes a new instance of the StorageContext class. /// - public class StorageContext : StorageContextBase + /// The options that are used to connect to the SQL Server database. + public StorageContext(IOptions options) + : base(options) { - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The options that are used to connect to the SQL Server database. - public StorageContext(IOptions options) - : base(options) - { - } } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper.Sqlite/StorageContext.cs b/src/ExtCore.Data.Dapper.Sqlite/StorageContext.cs index 2ea1293..e981d95 100644 --- a/src/ExtCore.Data.Dapper.Sqlite/StorageContext.cs +++ b/src/ExtCore.Data.Dapper.Sqlite/StorageContext.cs @@ -3,21 +3,20 @@ using Microsoft.Extensions.Options; -namespace ExtCore.Data.Dapper.Sqlite +namespace ExtCore.Data.Dapper.Sqlite; + +/// +/// Implements the IStorageContext interface and represents SQLite database +/// with the Dapper as the ORM. +/// +public class StorageContext : StorageContextBase { /// - /// Implements the IStorageContext interface and represents SQLite database - /// with the Dapper as the ORM. + /// Initializes a new instance of the StorageContext class. /// - public class StorageContext : StorageContextBase + /// The options that are used to connect to the SQLite database. + public StorageContext(IOptions options) + : base(options) { - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The options that are used to connect to the SQLite database. - public StorageContext(IOptions options) - : base(options) - { - } } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper/Actions/AddStorageContextAction.cs b/src/ExtCore.Data.Dapper/Actions/AddStorageContextAction.cs index e1c6771..827df3f 100644 --- a/src/ExtCore.Data.Dapper/Actions/AddStorageContextAction.cs +++ b/src/ExtCore.Data.Dapper/Actions/AddStorageContextAction.cs @@ -10,41 +10,40 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -namespace ExtCore.Data.Dapper.Actions +namespace ExtCore.Data.Dapper.Actions; + +/// +/// Implements the IConfigureServicesAction interface and +/// registers found implementation of the IStorageContext interface inside the DI. +/// +public class AddStorageContextAction : IConfigureServicesAction { /// - /// Implements the IConfigureServicesAction interface and - /// registers found implementation of the IStorageContext interface inside the DI. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). + /// + public int Priority => 1000; + + /// + /// Registers found implementation of the IStorageContext interface inside the DI. /// - public class AddStorageContextAction : IConfigureServicesAction + /// + /// Will be provided by the ExtCore and might be used to register any service inside the DI. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + public void Execute(IServiceCollection services, IServiceProvider serviceProvider) { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - public int Priority => 1000; + Type type = ExtensionManager.GetImplementations()?.FirstOrDefault(t => !t.GetTypeInfo().IsAbstract); - /// - /// Registers found implementation of the IStorageContext interface inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to register any service inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - public void Execute(IServiceCollection services, IServiceProvider serviceProvider) + if (type == null) { - Type type = ExtensionManager.GetImplementations()?.FirstOrDefault(t => !t.GetTypeInfo().IsAbstract); + ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Data.Dapper"); - if (type == null) - { - ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Data.Dapper"); - - logger.LogError("Implementation of ExtCore.Data.Abstractions.IStorageContext not found"); - return; - } - - services.AddScoped(typeof(IStorageContext), type); + logger.LogError("Implementation of ExtCore.Data.Abstractions.IStorageContext not found"); + return; } + + services.AddScoped(typeof(IStorageContext), type); } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper/Extension.cs b/src/ExtCore.Data.Dapper/Extension.cs index ee95334..9de1801 100644 --- a/src/ExtCore.Data.Dapper/Extension.cs +++ b/src/ExtCore.Data.Dapper/Extension.cs @@ -3,32 +3,31 @@ using ExtCore.Infrastructure; -namespace ExtCore.Data.Dapper +namespace ExtCore.Data.Dapper; + +/// +/// Overrides the ExtensionBase class and provides the +/// ExtCore.Data.Dapper extension information. +/// +public class Extension : ExtensionBase { /// - /// Overrides the ExtensionBase class and provides the - /// ExtCore.Data.Dapper extension information. + /// Gets the name of the extension. /// - public class Extension : ExtensionBase - { - /// - /// Gets the name of the extension. - /// - public override string Name => "ExtCore.Data.Dapper"; + public override string Name => "ExtCore.Data.Dapper"; - /// - /// Gets the URL of the extension. - /// - public override string Url => "https://extcore.net/"; + /// + /// Gets the URL of the extension. + /// + public override string Url => "https://extcore.net/"; - /// - /// Gets the version of the extension. - /// - public override string Version => "8.1.0"; + /// + /// Gets the version of the extension. + /// + public override string Version => "8.1.0"; - /// - /// Gets the authors of the extension (separated by commas). - /// - public override string Authors => "Dmitry Sikorsky"; - } + /// + /// Gets the authors of the extension (separated by commas). + /// + public override string Authors => "Dmitry Sikorsky"; } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper/RepositoryBase.cs b/src/ExtCore.Data.Dapper/RepositoryBase.cs index ff57599..f94302b 100644 --- a/src/ExtCore.Data.Dapper/RepositoryBase.cs +++ b/src/ExtCore.Data.Dapper/RepositoryBase.cs @@ -4,25 +4,24 @@ using ExtCore.Data.Abstractions; using ExtCore.Data.Entities.Abstractions; -namespace ExtCore.Data.Dapper +namespace ExtCore.Data.Dapper; + +/// +/// Implements the IRepository interface and represents default repository behavior. +/// +/// The entity type this repository operates. +public abstract class RepositoryBase : IRepository where TEntity : class, IEntity { + protected IStorageContext storageContext; + protected string connectionString; + /// - /// Implements the IRepository interface and represents default repository behavior. + /// Sets the Dapper storage context that represents the physical storage to work with. /// - /// The entity type this repository operates. - public abstract class RepositoryBase : IRepository where TEntity : class, IEntity + /// The Dapper storage context to set. + public void SetStorageContext(IStorageContext storageContext) { - protected IStorageContext storageContext; - protected string connectionString; - - /// - /// Sets the Dapper storage context that represents the physical storage to work with. - /// - /// The Dapper storage context to set. - public void SetStorageContext(IStorageContext storageContext) - { - this.storageContext = storageContext; - this.connectionString = (storageContext as StorageContextBase).ConnectionString; - } + this.storageContext = storageContext; + this.connectionString = (storageContext as StorageContextBase).ConnectionString; } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper/Storage.cs b/src/ExtCore.Data.Dapper/Storage.cs index 6744728..2d5a3a2 100644 --- a/src/ExtCore.Data.Dapper/Storage.cs +++ b/src/ExtCore.Data.Dapper/Storage.cs @@ -5,54 +5,53 @@ using ExtCore.Data.Abstractions; using ExtCore.Infrastructure; -namespace ExtCore.Data.Dapper +namespace ExtCore.Data.Dapper; + +/// +/// Implements the IStorage interface and represents implementation of the +/// Unit of Work design pattern with the mechanism of getting the repositories to work with the underlying +/// Dapper storage context and committing the changes made by all the repositories. +/// +public class Storage : IStorage { /// - /// Implements the IStorage interface and represents implementation of the - /// Unit of Work design pattern with the mechanism of getting the repositories to work with the underlying - /// Dapper storage context and committing the changes made by all the repositories. + /// Gets the Dapper storage context. /// - public class Storage : IStorage + public IStorageContext StorageContext { get; private set; } + + public Storage(IStorageContext storageContext) + { + this.StorageContext = storageContext; + } + + /// + /// Gets a repository of the given type. + /// + /// The type parameter to find implementation of. + /// + public TRepository GetRepository() where TRepository : IRepository + { + TRepository repository = ExtensionManager.GetInstance(); + + if (repository != null) + repository.SetStorageContext(this.StorageContext); + + return repository; + } + + /// + /// Commits the changes made by all the repositories. + /// + public int Save() + { + return -1; + } + + /// + /// Asynchronously commits the changes made by all the repositories. + /// + public async Task SaveAsync() { - /// - /// Gets the Dapper storage context. - /// - public IStorageContext StorageContext { get; private set; } - - public Storage(IStorageContext storageContext) - { - this.StorageContext = storageContext; - } - - /// - /// Gets a repository of the given type. - /// - /// The type parameter to find implementation of. - /// - public TRepository GetRepository() where TRepository : IRepository - { - TRepository repository = ExtensionManager.GetInstance(); - - if (repository != null) - repository.SetStorageContext(this.StorageContext); - - return repository; - } - - /// - /// Commits the changes made by all the repositories. - /// - public int Save() - { - return -1; - } - - /// - /// Asynchronously commits the changes made by all the repositories. - /// - public async Task SaveAsync() - { - return -1; - } + return -1; } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper/StorageContextBase.cs b/src/ExtCore.Data.Dapper/StorageContextBase.cs index d8677bc..e8d7872 100644 --- a/src/ExtCore.Data.Dapper/StorageContextBase.cs +++ b/src/ExtCore.Data.Dapper/StorageContextBase.cs @@ -4,26 +4,25 @@ using ExtCore.Data.Abstractions; using Microsoft.Extensions.Options; -namespace ExtCore.Data.Dapper +namespace ExtCore.Data.Dapper; + +/// +/// Implements the IStorageContext interface and represents the physical storage +/// with the Dapper Core as the ORM. +/// +public abstract class StorageContextBase : IStorageContext { /// - /// Implements the IStorageContext interface and represents the physical storage - /// with the Dapper Core as the ORM. + /// The connection string that is used to connect to the physical storage. /// - public abstract class StorageContextBase : IStorageContext - { - /// - /// The connection string that is used to connect to the physical storage. - /// - public string ConnectionString { get; private set; } + public string ConnectionString { get; private set; } - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The connection string that is used to connect to the physical storage. - public StorageContextBase(IOptions options) - { - this.ConnectionString = options.Value.ConnectionString; - } + /// + /// Initializes a new instance of the StorageContext class. + /// + /// The connection string that is used to connect to the physical storage. + public StorageContextBase(IOptions options) + { + this.ConnectionString = options.Value.ConnectionString; } } \ No newline at end of file diff --git a/src/ExtCore.Data.Dapper/StorageContextOptions.cs b/src/ExtCore.Data.Dapper/StorageContextOptions.cs index e22b924..5691a6b 100644 --- a/src/ExtCore.Data.Dapper/StorageContextOptions.cs +++ b/src/ExtCore.Data.Dapper/StorageContextOptions.cs @@ -1,16 +1,15 @@ // Copyright © 2017 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.Data.Dapper +namespace ExtCore.Data.Dapper; + +/// +/// Represents Dapper storage context options. +/// +public class StorageContextOptions { /// - /// Represents Dapper storage context options. + /// The connection string that is used to connect to the physical storage. /// - public class StorageContextOptions - { - /// - /// The connection string that is used to connect to the physical storage. - /// - public string ConnectionString { get; set; } - } + public string ConnectionString { get; set; } } \ No newline at end of file diff --git a/src/ExtCore.Data.Entities.Abstractions/IEntity.cs b/src/ExtCore.Data.Entities.Abstractions/IEntity.cs index b6c8236..2208af2 100644 --- a/src/ExtCore.Data.Entities.Abstractions/IEntity.cs +++ b/src/ExtCore.Data.Entities.Abstractions/IEntity.cs @@ -1,12 +1,11 @@ // Copyright © 2015 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.Data.Entities.Abstractions +namespace ExtCore.Data.Entities.Abstractions; + +/// +/// Describes an entity. +/// +public interface IEntity { - /// - /// Describes an entity. - /// - public interface IEntity - { - } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework.MySql/StorageContext.cs b/src/ExtCore.Data.EntityFramework.MySql/StorageContext.cs index 38fba6e..3daec68 100644 --- a/src/ExtCore.Data.EntityFramework.MySql/StorageContext.cs +++ b/src/ExtCore.Data.EntityFramework.MySql/StorageContext.cs @@ -4,34 +4,33 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -namespace ExtCore.Data.EntityFramework.MySql +namespace ExtCore.Data.EntityFramework.MySql; + +/// +/// Implements the IStorageContext interface and represents MySQL database +/// with the Entity Framework Core as the ORM. +/// +public class StorageContext : StorageContextBase { /// - /// Implements the IStorageContext interface and represents MySQL database - /// with the Entity Framework Core as the ORM. + /// Initializes a new instance of the StorageContext class. /// - public class StorageContext : StorageContextBase - { - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The options that are used to connect to the MySQL database. - public StorageContext(IOptions options) : base(options) { } + /// The options that are used to connect to the MySQL database. + public StorageContext(IOptions options) : base(options) { } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - base.OnConfiguring(optionsBuilder); + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + base.OnConfiguring(optionsBuilder); - if (string.IsNullOrEmpty(this.MigrationsAssembly)) - optionsBuilder.UseMySQL(this.ConnectionString); + if (string.IsNullOrEmpty(this.MigrationsAssembly)) + optionsBuilder.UseMySQL(this.ConnectionString); - else optionsBuilder.UseMySQL( - this.ConnectionString, - options => - { - options.MigrationsAssembly(this.MigrationsAssembly); - } - ); - } + else optionsBuilder.UseMySQL( + this.ConnectionString, + options => + { + options.MigrationsAssembly(this.MigrationsAssembly); + } + ); } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework.PostgreSql/StorageContext.cs b/src/ExtCore.Data.EntityFramework.PostgreSql/StorageContext.cs index 9656f21..099d407 100644 --- a/src/ExtCore.Data.EntityFramework.PostgreSql/StorageContext.cs +++ b/src/ExtCore.Data.EntityFramework.PostgreSql/StorageContext.cs @@ -4,34 +4,33 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -namespace ExtCore.Data.EntityFramework.PostgreSql +namespace ExtCore.Data.EntityFramework.PostgreSql; + +/// +/// Implements the IStorageContext interface and represents PostgreSQL database +/// with the Entity Framework Core as the ORM. +/// +public class StorageContext : StorageContextBase { /// - /// Implements the IStorageContext interface and represents PostgreSQL database - /// with the Entity Framework Core as the ORM. + /// Initializes a new instance of the StorageContext class. /// - public class StorageContext : StorageContextBase - { - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The options that are used to connect to the PostgreSQL database. - public StorageContext(IOptions options) : base(options) { } + /// The options that are used to connect to the PostgreSQL database. + public StorageContext(IOptions options) : base(options) { } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - base.OnConfiguring(optionsBuilder); + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + base.OnConfiguring(optionsBuilder); - if (string.IsNullOrEmpty(this.MigrationsAssembly)) - optionsBuilder.UseNpgsql(this.ConnectionString); + if (string.IsNullOrEmpty(this.MigrationsAssembly)) + optionsBuilder.UseNpgsql(this.ConnectionString); - else optionsBuilder.UseNpgsql( - this.ConnectionString, - options => - { - options.MigrationsAssembly(this.MigrationsAssembly); - } - ); - } + else optionsBuilder.UseNpgsql( + this.ConnectionString, + options => + { + options.MigrationsAssembly(this.MigrationsAssembly); + } + ); } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework.SqlServer/StorageContext.cs b/src/ExtCore.Data.EntityFramework.SqlServer/StorageContext.cs index 0852b03..1665173 100644 --- a/src/ExtCore.Data.EntityFramework.SqlServer/StorageContext.cs +++ b/src/ExtCore.Data.EntityFramework.SqlServer/StorageContext.cs @@ -4,34 +4,33 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -namespace ExtCore.Data.EntityFramework.SqlServer +namespace ExtCore.Data.EntityFramework.SqlServer; + +/// +/// Implements the IStorageContext interface and represents SQL Server database +/// with the Entity Framework Core as the ORM. +/// +public class StorageContext : StorageContextBase { /// - /// Implements the IStorageContext interface and represents SQL Server database - /// with the Entity Framework Core as the ORM. + /// Initializes a new instance of the StorageContext class. /// - public class StorageContext : StorageContextBase - { - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The options that are used to connect to the SQL Server database. - public StorageContext(IOptions options) : base(options) { } + /// The options that are used to connect to the SQL Server database. + public StorageContext(IOptions options) : base(options) { } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - base.OnConfiguring(optionsBuilder); + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + base.OnConfiguring(optionsBuilder); - if (string.IsNullOrEmpty(this.MigrationsAssembly)) - optionsBuilder.UseSqlServer(this.ConnectionString); + if (string.IsNullOrEmpty(this.MigrationsAssembly)) + optionsBuilder.UseSqlServer(this.ConnectionString); - else optionsBuilder.UseSqlServer( - this.ConnectionString, - options => - { - options.MigrationsAssembly(this.MigrationsAssembly); - } - ); - } + else optionsBuilder.UseSqlServer( + this.ConnectionString, + options => + { + options.MigrationsAssembly(this.MigrationsAssembly); + } + ); } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework.Sqlite/StorageContext.cs b/src/ExtCore.Data.EntityFramework.Sqlite/StorageContext.cs index d288f0d..90ee51a 100644 --- a/src/ExtCore.Data.EntityFramework.Sqlite/StorageContext.cs +++ b/src/ExtCore.Data.EntityFramework.Sqlite/StorageContext.cs @@ -4,37 +4,36 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -namespace ExtCore.Data.EntityFramework.Sqlite +namespace ExtCore.Data.EntityFramework.Sqlite; + +/// +/// Implements the IStorageContext interface and represents SQLite database +/// with the Entity Framework Core as the ORM. +/// +public class StorageContext : StorageContextBase { /// - /// Implements the IStorageContext interface and represents SQLite database - /// with the Entity Framework Core as the ORM. + /// Initializes a new instance of the StorageContext class. /// - public class StorageContext : StorageContextBase + /// The options that are used to connect to the SQLite database. + public StorageContext(IOptions options) + : base(options) { - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The options that are used to connect to the SQLite database. - public StorageContext(IOptions options) - : base(options) - { - } + } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - base.OnConfiguring(optionsBuilder); + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + base.OnConfiguring(optionsBuilder); - if (string.IsNullOrEmpty(this.MigrationsAssembly)) - optionsBuilder.UseSqlite(this.ConnectionString); + if (string.IsNullOrEmpty(this.MigrationsAssembly)) + optionsBuilder.UseSqlite(this.ConnectionString); - else optionsBuilder.UseSqlite( - this.ConnectionString, - options => - { - options.MigrationsAssembly(this.MigrationsAssembly); - } - ); - } + else optionsBuilder.UseSqlite( + this.ConnectionString, + options => + { + options.MigrationsAssembly(this.MigrationsAssembly); + } + ); } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework/Actions/AddStorageContextAction.cs b/src/ExtCore.Data.EntityFramework/Actions/AddStorageContextAction.cs index 8b0b45c..045e870 100644 --- a/src/ExtCore.Data.EntityFramework/Actions/AddStorageContextAction.cs +++ b/src/ExtCore.Data.EntityFramework/Actions/AddStorageContextAction.cs @@ -10,41 +10,40 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -namespace ExtCore.Data.EntityFramework.Actions +namespace ExtCore.Data.EntityFramework.Actions; + +/// +/// Implements the IConfigureServicesAction interface and +/// registers found implementation of the IStorageContext interface inside the DI. +/// +public class AddStorageContextAction : IConfigureServicesAction { /// - /// Implements the IConfigureServicesAction interface and - /// registers found implementation of the IStorageContext interface inside the DI. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). + /// + public int Priority => 1000; + + /// + /// Registers found implementation of the IStorageContext interface inside the DI. /// - public class AddStorageContextAction : IConfigureServicesAction + /// + /// Will be provided by the ExtCore and might be used to register any service inside the DI. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + public void Execute(IServiceCollection services, IServiceProvider serviceProvider) { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - public int Priority => 1000; + Type type = ExtensionManager.GetImplementations()?.FirstOrDefault(t => !t.GetTypeInfo().IsAbstract); - /// - /// Registers found implementation of the IStorageContext interface inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to register any service inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - public void Execute(IServiceCollection services, IServiceProvider serviceProvider) + if (type == null) { - Type type = ExtensionManager.GetImplementations()?.FirstOrDefault(t => !t.GetTypeInfo().IsAbstract); + ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Data.EntityFramework"); - if (type == null) - { - ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Data.EntityFramework"); - - logger.LogError("Implementation of ExtCore.Data.Abstractions.IStorageContext not found"); - return; - } - - services.AddScoped(typeof(IStorageContext), type); + logger.LogError("Implementation of ExtCore.Data.Abstractions.IStorageContext not found"); + return; } + + services.AddScoped(typeof(IStorageContext), type); } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework/DesignTimeStorageContextFactoryBase.cs b/src/ExtCore.Data.EntityFramework/DesignTimeStorageContextFactoryBase.cs index f954a9b..3611e98 100644 --- a/src/ExtCore.Data.EntityFramework/DesignTimeStorageContextFactoryBase.cs +++ b/src/ExtCore.Data.EntityFramework/DesignTimeStorageContextFactoryBase.cs @@ -6,41 +6,40 @@ using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.DependencyInjection; -namespace ExtCore.Data.EntityFramework +namespace ExtCore.Data.EntityFramework; + +/// +/// Implements the interface and represents the factory for providing +/// the registered inside the DI storage context service to the Entity Framework Core tools (such as Migrations). +/// Inherit from this class and call the Initialize method in your web application after the class +/// is configured in order the Entity Framework Core tools (such as Migrations) to work. +/// +/// The storage context type this factory creates. +public abstract class DesignTimeStorageContextFactoryBase : IDesignTimeDbContextFactory where T : StorageContextBase { /// - /// Implements the interface and represents the factory for providing - /// the registered inside the DI storage context service to the Entity Framework Core tools (such as Migrations). - /// Inherit from this class and call the Initialize method in your web application after the class - /// is configured in order the Entity Framework Core tools (such as Migrations) to work. + /// The storage context service from the DI. /// - /// The storage context type this factory creates. - public abstract class DesignTimeStorageContextFactoryBase : IDesignTimeDbContextFactory where T : StorageContextBase - { - /// - /// The storage context service from the DI. - /// - public static T StorageContext { get; set; } + public static T StorageContext { get; set; } - /// - /// Gets the storage context service set by the Initialize method. - /// - /// - /// Storage context service set by the Initialize method. - public T CreateDbContext(string[] args) - { - return DesignTimeStorageContextFactoryBase.StorageContext; - } + /// + /// Gets the storage context service set by the Initialize method. + /// + /// + /// Storage context service set by the Initialize method. + public T CreateDbContext(string[] args) + { + return DesignTimeStorageContextFactoryBase.StorageContext; + } - /// - /// Gets the storage context service from the DI and then sets it to the StorageContext property. - /// Call this method inside the Startup.ConfigureServices one after the class - /// is configured. - /// - /// The service provider to get the storage context service. - public static void Initialize(IServiceProvider serviceProvider) - { - DesignTimeStorageContextFactoryBase.StorageContext = serviceProvider.GetService() as T; - } + /// + /// Gets the storage context service from the DI and then sets it to the StorageContext property. + /// Call this method inside the Startup.ConfigureServices one after the class + /// is configured. + /// + /// The service provider to get the storage context service. + public static void Initialize(IServiceProvider serviceProvider) + { + DesignTimeStorageContextFactoryBase.StorageContext = serviceProvider.GetService() as T; } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework/Extension.cs b/src/ExtCore.Data.EntityFramework/Extension.cs index 4e996ed..ac2f072 100644 --- a/src/ExtCore.Data.EntityFramework/Extension.cs +++ b/src/ExtCore.Data.EntityFramework/Extension.cs @@ -3,32 +3,31 @@ using ExtCore.Infrastructure; -namespace ExtCore.Data.EntityFramework +namespace ExtCore.Data.EntityFramework; + +/// +/// Overrides the ExtensionBase class and provides the +/// ExtCore.Data.EntityFramework extension information. +/// +public class Extension : ExtensionBase { /// - /// Overrides the ExtensionBase class and provides the - /// ExtCore.Data.EntityFramework extension information. + /// Gets the name of the extension. /// - public class Extension : ExtensionBase - { - /// - /// Gets the name of the extension. - /// - public override string Name => "ExtCore.Data.EntityFramework"; + public override string Name => "ExtCore.Data.EntityFramework"; - /// - /// Gets the URL of the extension. - /// - public override string Url => "https://extcore.net/"; + /// + /// Gets the URL of the extension. + /// + public override string Url => "https://extcore.net/"; - /// - /// Gets the version of the extension. - /// - public override string Version => "8.1.0"; + /// + /// Gets the version of the extension. + /// + public override string Version => "8.1.0"; - /// - /// Gets the authors of the extension (separated by commas). - /// - public override string Authors => "Dmitry Sikorsky"; - } + /// + /// Gets the authors of the extension (separated by commas). + /// + public override string Authors => "Dmitry Sikorsky"; } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework/Extensions/StorageContextExtensions.cs b/src/ExtCore.Data.EntityFramework/Extensions/StorageContextExtensions.cs index f8d15f5..81acefd 100644 --- a/src/ExtCore.Data.EntityFramework/Extensions/StorageContextExtensions.cs +++ b/src/ExtCore.Data.EntityFramework/Extensions/StorageContextExtensions.cs @@ -5,23 +5,22 @@ using ExtCore.Infrastructure; using Microsoft.EntityFrameworkCore; -namespace ExtCore.Data.EntityFramework +namespace ExtCore.Data.EntityFramework; + +/// +/// Contains the extension methods of the IStorageContext interface. +/// +public static class StorageContextExtensions { /// - /// Contains the extension methods of the IStorageContext interface. + /// Registers the entities from all the extensions inside the single Entity Framework storage context + /// by finding all the implementations of the IEntityRegistrar interface. /// - public static class StorageContextExtensions + /// The Entity Framework storage context. + /// The Entity Framework model builder. + public static void RegisterEntities(this IStorageContext storageContext, ModelBuilder modelBuilder) { - /// - /// Registers the entities from all the extensions inside the single Entity Framework storage context - /// by finding all the implementations of the IEntityRegistrar interface. - /// - /// The Entity Framework storage context. - /// The Entity Framework model builder. - public static void RegisterEntities(this IStorageContext storageContext, ModelBuilder modelBuilder) - { - foreach (IEntityRegistrar entityRegistrar in ExtensionManager.GetInstances()) - entityRegistrar.RegisterEntities(modelBuilder); - } + foreach (IEntityRegistrar entityRegistrar in ExtensionManager.GetInstances()) + entityRegistrar.RegisterEntities(modelBuilder); } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework/IEntityRegistrar.cs b/src/ExtCore.Data.EntityFramework/IEntityRegistrar.cs index abf13dd..f03d4a3 100644 --- a/src/ExtCore.Data.EntityFramework/IEntityRegistrar.cs +++ b/src/ExtCore.Data.EntityFramework/IEntityRegistrar.cs @@ -3,17 +3,16 @@ using Microsoft.EntityFrameworkCore; -namespace ExtCore.Data.EntityFramework +namespace ExtCore.Data.EntityFramework; + +/// +/// Describes a mechanism of registering entities inside the Entity Framework storage context. +/// +public interface IEntityRegistrar { /// - /// Describes a mechanism of registering entities inside the Entity Framework storage context. + /// Registers entities inside the Entity Framework storage context. /// - public interface IEntityRegistrar - { - /// - /// Registers entities inside the Entity Framework storage context. - /// - /// The Entity Framework model builder. - void RegisterEntities(ModelBuilder modelbuilder); - } + /// The Entity Framework model builder. + void RegisterEntities(ModelBuilder modelbuilder); } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework/RepositoryBase.cs b/src/ExtCore.Data.EntityFramework/RepositoryBase.cs index 1a022c1..40f9ced 100644 --- a/src/ExtCore.Data.EntityFramework/RepositoryBase.cs +++ b/src/ExtCore.Data.EntityFramework/RepositoryBase.cs @@ -5,25 +5,24 @@ using ExtCore.Data.Entities.Abstractions; using Microsoft.EntityFrameworkCore; -namespace ExtCore.Data.EntityFramework +namespace ExtCore.Data.EntityFramework; + +/// +/// Implements the IRepository interface and represents default repository behavior. +/// +/// The entity type this repository operates. +public abstract class RepositoryBase : IRepository where TEntity : class, IEntity { + protected DbContext storageContext; + protected DbSet dbSet; + /// - /// Implements the IRepository interface and represents default repository behavior. + /// Sets the Entity Framework storage context that represents the physical storage to work with. /// - /// The entity type this repository operates. - public abstract class RepositoryBase : IRepository where TEntity : class, IEntity + /// The Entity Framework storage context to set. + public void SetStorageContext(IStorageContext storageContext) { - protected DbContext storageContext; - protected DbSet dbSet; - - /// - /// Sets the Entity Framework storage context that represents the physical storage to work with. - /// - /// The Entity Framework storage context to set. - public void SetStorageContext(IStorageContext storageContext) - { - this.storageContext = storageContext as DbContext; - this.dbSet = this.storageContext.Set(); - } + this.storageContext = storageContext as DbContext; + this.dbSet = this.storageContext.Set(); } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework/Storage.cs b/src/ExtCore.Data.EntityFramework/Storage.cs index 43c866d..6a7ac93 100644 --- a/src/ExtCore.Data.EntityFramework/Storage.cs +++ b/src/ExtCore.Data.EntityFramework/Storage.cs @@ -7,57 +7,56 @@ using ExtCore.Infrastructure; using Microsoft.EntityFrameworkCore; -namespace ExtCore.Data.EntityFramework +namespace ExtCore.Data.EntityFramework; + +/// +/// Implements the IStorage interface and represents implementation of the +/// Unit of Work design pattern with the mechanism of getting the repositories to work with the underlying +/// Entity Framework storage context and committing the changes made by all the repositories. +/// +public class Storage : IStorage { /// - /// Implements the IStorage interface and represents implementation of the - /// Unit of Work design pattern with the mechanism of getting the repositories to work with the underlying - /// Entity Framework storage context and committing the changes made by all the repositories. + /// Gets the Entity Framework storage context. /// - public class Storage : IStorage + public IStorageContext StorageContext { get; private set; } + + public Storage(IStorageContext storageContext) + { + if (!(storageContext is DbContext)) + throw new ArgumentException("The storageContext object must be an instance of the Microsoft.EntityFrameworkCore.DbContext class."); + + this.StorageContext = storageContext; + } + + /// + /// Gets a repository of the given type. + /// + /// The type parameter to find implementation of. + /// + public TRepository GetRepository() where TRepository : IRepository + { + TRepository repository = ExtensionManager.GetInstance(); + + if (repository != null) + repository.SetStorageContext(this.StorageContext); + + return repository; + } + + /// + /// Commits the changes made by all the repositories. + /// + public int Save() + { + return (this.StorageContext as DbContext).SaveChanges(); + } + + /// + /// Asynchronously commits the changes made by all the repositories. + /// + public async Task SaveAsync() { - /// - /// Gets the Entity Framework storage context. - /// - public IStorageContext StorageContext { get; private set; } - - public Storage(IStorageContext storageContext) - { - if (!(storageContext is DbContext)) - throw new ArgumentException("The storageContext object must be an instance of the Microsoft.EntityFrameworkCore.DbContext class."); - - this.StorageContext = storageContext; - } - - /// - /// Gets a repository of the given type. - /// - /// The type parameter to find implementation of. - /// - public TRepository GetRepository() where TRepository : IRepository - { - TRepository repository = ExtensionManager.GetInstance(); - - if (repository != null) - repository.SetStorageContext(this.StorageContext); - - return repository; - } - - /// - /// Commits the changes made by all the repositories. - /// - public int Save() - { - return (this.StorageContext as DbContext).SaveChanges(); - } - - /// - /// Asynchronously commits the changes made by all the repositories. - /// - public async Task SaveAsync() - { - return await (this.StorageContext as DbContext).SaveChangesAsync(); - } + return await (this.StorageContext as DbContext).SaveChangesAsync(); } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework/StorageContextBase.cs b/src/ExtCore.Data.EntityFramework/StorageContextBase.cs index edc47c4..90a5e1d 100644 --- a/src/ExtCore.Data.EntityFramework/StorageContextBase.cs +++ b/src/ExtCore.Data.EntityFramework/StorageContextBase.cs @@ -5,38 +5,37 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -namespace ExtCore.Data.EntityFramework +namespace ExtCore.Data.EntityFramework; + +/// +/// Implements the IStorageContext interface and represents the physical storage +/// with the Entity Framework Core as the ORM. +/// +public abstract class StorageContextBase : DbContext, IStorageContext { /// - /// Implements the IStorageContext interface and represents the physical storage - /// with the Entity Framework Core as the ORM. + /// The connection string that is used to connect to the physical storage. /// - public abstract class StorageContextBase : DbContext, IStorageContext - { - /// - /// The connection string that is used to connect to the physical storage. - /// - public string ConnectionString { get; private set; } + public string ConnectionString { get; private set; } - /// - /// The assembly name where migrations are maintained for this context. - /// - public string MigrationsAssembly { get; private set; } + /// + /// The assembly name where migrations are maintained for this context. + /// + public string MigrationsAssembly { get; private set; } - /// - /// Initializes a new instance of the StorageContext class. - /// - /// The connection string that is used to connect to the physical storage. - public StorageContextBase(IOptions options) - { - this.ConnectionString = options.Value.ConnectionString; - this.MigrationsAssembly = options.Value.MigrationsAssembly; - } + /// + /// Initializes a new instance of the StorageContext class. + /// + /// The connection string that is used to connect to the physical storage. + public StorageContextBase(IOptions options) + { + this.ConnectionString = options.Value.ConnectionString; + this.MigrationsAssembly = options.Value.MigrationsAssembly; + } - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - base.OnModelCreating(modelBuilder); - this.RegisterEntities(modelBuilder); - } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + this.RegisterEntities(modelBuilder); } } \ No newline at end of file diff --git a/src/ExtCore.Data.EntityFramework/StorageContextOptions.cs b/src/ExtCore.Data.EntityFramework/StorageContextOptions.cs index 3d82d98..cff88ab 100644 --- a/src/ExtCore.Data.EntityFramework/StorageContextOptions.cs +++ b/src/ExtCore.Data.EntityFramework/StorageContextOptions.cs @@ -1,21 +1,20 @@ // Copyright © 2017 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.Data.EntityFramework +namespace ExtCore.Data.EntityFramework; + +/// +/// Represents Entity Framework storage context options. +/// +public class StorageContextOptions { /// - /// Represents Entity Framework storage context options. + /// The connection string that is used to connect to the physical storage. /// - public class StorageContextOptions - { - /// - /// The connection string that is used to connect to the physical storage. - /// - public string ConnectionString { get; set; } + public string ConnectionString { get; set; } - /// - /// The assembly name where migrations are maintained for this context. - /// - public string MigrationsAssembly { get; set; } - } + /// + /// The assembly name where migrations are maintained for this context. + /// + public string MigrationsAssembly { get; set; } } \ No newline at end of file diff --git a/src/ExtCore.Data/Actions/AddStorageAction.cs b/src/ExtCore.Data/Actions/AddStorageAction.cs index 9989b63..883ed36 100644 --- a/src/ExtCore.Data/Actions/AddStorageAction.cs +++ b/src/ExtCore.Data/Actions/AddStorageAction.cs @@ -10,41 +10,40 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -namespace ExtCore.Data.Actions +namespace ExtCore.Data.Actions; + +/// +/// Implements the IConfigureServicesAction interface and +/// registers found implementation of the IStorage interface inside the DI. +/// +public class AddStorageAction : IConfigureServicesAction { /// - /// Implements the IConfigureServicesAction interface and - /// registers found implementation of the IStorage interface inside the DI. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). + /// + public int Priority => 1000; + + /// + /// Registers found implementation of the IStorage interface inside the DI. /// - public class AddStorageAction : IConfigureServicesAction + /// + /// Will be provided by the ExtCore and might be used to register any service inside the DI. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + public void Execute(IServiceCollection services, IServiceProvider serviceProvider) { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - public int Priority => 1000; + Type type = ExtensionManager.GetImplementations()?.FirstOrDefault(t => !t.GetTypeInfo().IsAbstract); - /// - /// Registers found implementation of the IStorage interface inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to register any service inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - public void Execute(IServiceCollection services, IServiceProvider serviceProvider) + if (type == null) { - Type type = ExtensionManager.GetImplementations()?.FirstOrDefault(t => !t.GetTypeInfo().IsAbstract); + ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Data"); - if (type == null) - { - ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Data"); - - logger.LogError("Implementation of ExtCore.Data.Abstractions.IStorage not found"); - return; - } - - services.AddScoped(typeof(IStorage), type); + logger.LogError("Implementation of ExtCore.Data.Abstractions.IStorage not found"); + return; } + + services.AddScoped(typeof(IStorage), type); } } \ No newline at end of file diff --git a/src/ExtCore.Data/Extension.cs b/src/ExtCore.Data/Extension.cs index b0fe161..4f244df 100644 --- a/src/ExtCore.Data/Extension.cs +++ b/src/ExtCore.Data/Extension.cs @@ -3,31 +3,30 @@ using ExtCore.Infrastructure; -namespace ExtCore.Data +namespace ExtCore.Data; + +/// +/// Overrides the ExtensionBase class and provides the ExtCore.Data extension information. +/// +public class Extension : ExtensionBase { /// - /// Overrides the ExtensionBase class and provides the ExtCore.Data extension information. + /// Gets the name of the extension. /// - public class Extension : ExtensionBase - { - /// - /// Gets the name of the extension. - /// - public override string Name => "ExtCore.Data"; + public override string Name => "ExtCore.Data"; - /// - /// Gets the URL of the extension. - /// - public override string Url => "https://extcore.net/"; + /// + /// Gets the URL of the extension. + /// + public override string Url => "https://extcore.net/"; - /// - /// Gets the version of the extension. - /// - public override string Version => "8.1.0"; + /// + /// Gets the version of the extension. + /// + public override string Version => "8.1.0"; - /// - /// Gets the authors of the extension (separated by commas). - /// - public override string Authors => "Dmitry Sikorsky"; - } + /// + /// Gets the authors of the extension (separated by commas). + /// + public override string Authors => "Dmitry Sikorsky"; } \ No newline at end of file diff --git a/src/ExtCore.Events/Event.cs b/src/ExtCore.Events/Event.cs index 414c8d7..6b3e3e4 100644 --- a/src/ExtCore.Events/Event.cs +++ b/src/ExtCore.Events/Event.cs @@ -5,110 +5,109 @@ using System.Linq; using ExtCore.Infrastructure; -namespace ExtCore.Events +namespace ExtCore.Events; + +/// +/// Represents an event that can be broadcasted and handled by the corresponding event handlers +/// specified by the TEventHandler type parameter. The event handlers +/// might be located in this or any other extension and will be resolved automatically by ExtCore. +/// +/// Defines the type of the event handlers that will handle the event. +public static class Event where TEventHandler : IEventHandler { /// - /// Represents an event that can be broadcasted and handled by the corresponding event handlers - /// specified by the TEventHandler type parameter. The event handlers - /// might be located in this or any other extension and will be resolved automatically by ExtCore. + /// Broadcasts the event to all the event handlers that are resolved automatically by ExtCore. /// - /// Defines the type of the event handlers that will handle the event. - public static class Event where TEventHandler : IEventHandler + /// Resolved event handlers that have handled the event. + public static IEnumerable Broadcast() { - /// - /// Broadcasts the event to all the event handlers that are resolved automatically by ExtCore. - /// - /// Resolved event handlers that have handled the event. - public static IEnumerable Broadcast() - { - IEnumerable eventHandlers = ExtensionManager.GetInstances().OrderBy(eh => eh.Priority); + IEnumerable eventHandlers = ExtensionManager.GetInstances().OrderBy(eh => eh.Priority); - foreach (TEventHandler eventHandler in eventHandlers) - eventHandler.HandleEvent(); + foreach (TEventHandler eventHandler in eventHandlers) + eventHandler.HandleEvent(); - return eventHandlers; - } + return eventHandlers; } +} +/// +/// Represents an event that can be broadcasted and handled by the corresponding event handlers +/// specified by the TEventHandler type parameter. The event handlers +/// might be located in this or any other extension and will be resolved automatically by ExtCore. +/// +/// Defines the type of the event handlers that will handle the event. +/// Defines the type of the argument that will be passed to the event handlers. +public static class Event where TEventHandler : IEventHandler +{ /// - /// Represents an event that can be broadcasted and handled by the corresponding event handlers - /// specified by the TEventHandler type parameter. The event handlers - /// might be located in this or any other extension and will be resolved automatically by ExtCore. + /// Broadcasts the event to all the event handlers that are resolved automatically by ExtCore. /// - /// Defines the type of the event handlers that will handle the event. - /// Defines the type of the argument that will be passed to the event handlers. - public static class Event where TEventHandler : IEventHandler + /// The event argument. + /// Resolved event handlers that have handled the event. + public static IEnumerable Broadcast(TEventArgument argument) { - /// - /// Broadcasts the event to all the event handlers that are resolved automatically by ExtCore. - /// - /// The event argument. - /// Resolved event handlers that have handled the event. - public static IEnumerable Broadcast(TEventArgument argument) - { - IEnumerable eventHandlers = ExtensionManager.GetInstances().OrderBy(eh => eh.Priority); + IEnumerable eventHandlers = ExtensionManager.GetInstances().OrderBy(eh => eh.Priority); - foreach (TEventHandler eventHandler in eventHandlers) - eventHandler.HandleEvent(argument); + foreach (TEventHandler eventHandler in eventHandlers) + eventHandler.HandleEvent(argument); - return eventHandlers; - } + return eventHandlers; } +} +/// +/// Represents an event that can be broadcasted and handled by the corresponding event handlers +/// specified by the TEventHandler type parameter. The event handlers +/// might be located in this or any other extension and will be resolved automatically by ExtCore. +/// +/// +/// Defines the type of the event handlers that will handle the event. +/// Defines the type of the first argument that will be passed to the event handlers. +/// Defines the type of the second argument that will be passed to the event handlers. +public static class Event where TEventHandler : IEventHandler +{ /// - /// Represents an event that can be broadcasted and handled by the corresponding event handlers - /// specified by the TEventHandler type parameter. The event handlers - /// might be located in this or any other extension and will be resolved automatically by ExtCore. + /// Broadcasts the event to all the event handlers that are resolved automatically by ExtCore. /// - /// - /// Defines the type of the event handlers that will handle the event. - /// Defines the type of the first argument that will be passed to the event handlers. - /// Defines the type of the second argument that will be passed to the event handlers. - public static class Event where TEventHandler : IEventHandler + /// The first event argument. + /// The second event argument. + /// Resolved event handlers that have handled the event. + public static IEnumerable Broadcast(TEventArgument1 argument1, TEventArgument2 argument2) { - /// - /// Broadcasts the event to all the event handlers that are resolved automatically by ExtCore. - /// - /// The first event argument. - /// The second event argument. - /// Resolved event handlers that have handled the event. - public static IEnumerable Broadcast(TEventArgument1 argument1, TEventArgument2 argument2) - { - IEnumerable eventHandlers = ExtensionManager.GetInstances().OrderBy(eh => eh.Priority); + IEnumerable eventHandlers = ExtensionManager.GetInstances().OrderBy(eh => eh.Priority); - foreach (TEventHandler eventHandler in eventHandlers) - eventHandler.HandleEvent(argument1, argument2); + foreach (TEventHandler eventHandler in eventHandlers) + eventHandler.HandleEvent(argument1, argument2); - return eventHandlers; - } + return eventHandlers; } +} +/// +/// Represents an event that can be broadcasted and handled by the corresponding event handlers +/// specified by the TEventHandler type parameter. The event handlers +/// might be located in this or any other extension and will be resolved automatically by ExtCore. +/// +/// Defines the type of the event handlers that will handle the event. +/// Defines the type of the first argument that will be passed to the event handlers. +/// Defines the type of the second argument that will be passed to the event handlers. +/// Defines the type of the third argument that will be passed to the event handlers. +public static class Event where TEventHandler : IEventHandler +{ /// - /// Represents an event that can be broadcasted and handled by the corresponding event handlers - /// specified by the TEventHandler type parameter. The event handlers - /// might be located in this or any other extension and will be resolved automatically by ExtCore. + /// Broadcasts the event to all the event handlers that are resolved automatically by ExtCore. /// - /// Defines the type of the event handlers that will handle the event. - /// Defines the type of the first argument that will be passed to the event handlers. - /// Defines the type of the second argument that will be passed to the event handlers. - /// Defines the type of the third argument that will be passed to the event handlers. - public static class Event where TEventHandler : IEventHandler + /// The first event argument. + /// The second event argument. + /// The third event argument. + /// Resolved event handlers that have handled the event. + public static IEnumerable Broadcast(TEventArgument1 argument1, TEventArgument2 argument2, TEventArgument3 argument3) { - /// - /// Broadcasts the event to all the event handlers that are resolved automatically by ExtCore. - /// - /// The first event argument. - /// The second event argument. - /// The third event argument. - /// Resolved event handlers that have handled the event. - public static IEnumerable Broadcast(TEventArgument1 argument1, TEventArgument2 argument2, TEventArgument3 argument3) - { - IEnumerable eventHandlers = ExtensionManager.GetInstances().OrderBy(eh => eh.Priority); + IEnumerable eventHandlers = ExtensionManager.GetInstances().OrderBy(eh => eh.Priority); - foreach (TEventHandler eventHandler in eventHandlers) - eventHandler.HandleEvent(argument1, argument2, argument3); + foreach (TEventHandler eventHandler in eventHandlers) + eventHandler.HandleEvent(argument1, argument2, argument3); - return eventHandlers; - } + return eventHandlers; } } \ No newline at end of file diff --git a/src/ExtCore.Events/Extension.cs b/src/ExtCore.Events/Extension.cs index d74fc53..4207f4f 100644 --- a/src/ExtCore.Events/Extension.cs +++ b/src/ExtCore.Events/Extension.cs @@ -3,31 +3,30 @@ using ExtCore.Infrastructure; -namespace ExtCore.Events +namespace ExtCore.Events; + +/// +/// Overrides the ExtensionBase class and provides the ExtCore.Events extension information. +/// +public class Extension : ExtensionBase { /// - /// Overrides the ExtensionBase class and provides the ExtCore.Events extension information. + /// Gets the name of the extension. /// - public class Extension : ExtensionBase - { - /// - /// Gets the name of the extension. - /// - public override string Name => "ExtCore.Events"; + public override string Name => "ExtCore.Events"; - /// - /// Gets the URL of the extension. - /// - public override string Url => "https://extcore.net/"; + /// + /// Gets the URL of the extension. + /// + public override string Url => "https://extcore.net/"; - /// - /// Gets the version of the extension. - /// - public override string Version => "8.1.0"; + /// + /// Gets the version of the extension. + /// + public override string Version => "8.1.0"; - /// - /// Gets the authors of the extension (separated by commas). - /// - public override string Authors => "Dmitry Sikorsky"; - } + /// + /// Gets the authors of the extension (separated by commas). + /// + public override string Authors => "Dmitry Sikorsky"; } \ No newline at end of file diff --git a/src/ExtCore.Events/IEventHandler.cs b/src/ExtCore.Events/IEventHandler.cs index 30d8da6..3010b96 100644 --- a/src/ExtCore.Events/IEventHandler.cs +++ b/src/ExtCore.Events/IEventHandler.cs @@ -1,89 +1,88 @@ // Copyright © 2017 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.Events +namespace ExtCore.Events; + +/// +/// Describes an event handler that can handle the events broadcasted by the +/// class. +/// +public interface IEventHandler { /// - /// Describes an event handler that can handle the events broadcasted by the - /// class. + /// Priority of the event handler. The event handlers of the same event will be executed in the order + /// specified by the priority. /// - public interface IEventHandler - { - /// - /// Priority of the event handler. The event handlers of the same event will be executed in the order - /// specified by the priority. - /// - int Priority { get; } + int Priority { get; } - /// - /// Handles the event. - /// - void HandleEvent(); - } + /// + /// Handles the event. + /// + void HandleEvent(); +} +/// +/// Describes an event handler that can handle the events broadcasted by the +/// class. +/// +/// Defines the type of the argument that will be passed to the event handler. +public interface IEventHandler +{ /// - /// Describes an event handler that can handle the events broadcasted by the - /// class. + /// Priority of the event handler. The event handlers of the same event will be executed in the order + /// specified by the priority. /// - /// Defines the type of the argument that will be passed to the event handler. - public interface IEventHandler - { - /// - /// Priority of the event handler. The event handlers of the same event will be executed in the order - /// specified by the priority. - /// - int Priority { get; } + int Priority { get; } - /// - /// Handles the event. - /// - /// The event argument. - void HandleEvent(TEventArgument argument); - } + /// + /// Handles the event. + /// + /// The event argument. + void HandleEvent(TEventArgument argument); +} +/// +/// Describes an event handler that can handle the events broadcasted by the +/// class. +/// +/// Defines the type of the first argument that will be passed to the event handler. +/// Defines the type of the second argument that will be passed to the event handler. +public interface IEventHandler +{ /// - /// Describes an event handler that can handle the events broadcasted by the - /// class. + /// Priority of the event handler. The event handlers of the same event will be executed in the order + /// specified by the priority. /// - /// Defines the type of the first argument that will be passed to the event handler. - /// Defines the type of the second argument that will be passed to the event handler. - public interface IEventHandler - { - /// - /// Priority of the event handler. The event handlers of the same event will be executed in the order - /// specified by the priority. - /// - int Priority { get; } + int Priority { get; } - /// - /// Handles the event. - /// - /// The first event argument. - /// The second event argument. - void HandleEvent(TEventArgument1 argument1, TEventArgument2 argument2); - } + /// + /// Handles the event. + /// + /// The first event argument. + /// The second event argument. + void HandleEvent(TEventArgument1 argument1, TEventArgument2 argument2); +} +/// +/// Describes an event handler that can handle the events broadcasted by the +/// class. +/// +/// Defines the type of the first argument that will be passed to the event handler. +/// Defines the type of the second argument that will be passed to the event handler. +/// Defines the type of the first argument that will be passed to the event handler. +public interface IEventHandler +{ /// - /// Describes an event handler that can handle the events broadcasted by the - /// class. + /// Priority of the event handler. The event handlers of the same event will be executed in the order + /// specified by the priority. /// - /// Defines the type of the first argument that will be passed to the event handler. - /// Defines the type of the second argument that will be passed to the event handler. - /// Defines the type of the first argument that will be passed to the event handler. - public interface IEventHandler - { - /// - /// Priority of the event handler. The event handlers of the same event will be executed in the order - /// specified by the priority. - /// - int Priority { get; } + int Priority { get; } - /// - /// Handles the event. - /// - /// The first event argument. - /// The second event argument. - /// The third event argument. - void HandleEvent(TEventArgument1 argument1, TEventArgument2 argument2, TEventArgument3 argument3); - } + /// + /// Handles the event. + /// + /// The first event argument. + /// The second event argument. + /// The third event argument. + void HandleEvent(TEventArgument1 argument1, TEventArgument2 argument2, TEventArgument3 argument3); } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Abstractions/Exceptions/AccessDeniedException.cs b/src/ExtCore.FileStorage.Abstractions/Exceptions/AccessDeniedException.cs index 16bde33..389e6b7 100644 --- a/src/ExtCore.FileStorage.Abstractions/Exceptions/AccessDeniedException.cs +++ b/src/ExtCore.FileStorage.Abstractions/Exceptions/AccessDeniedException.cs @@ -3,15 +3,14 @@ using System; -namespace ExtCore.FileStorage +namespace ExtCore.FileStorage; + +/// +/// Represents an access denied file storage exception. +/// +public class AccessDeniedException : FileStorageException { - /// - /// Represents an access denied file storage exception. - /// - public class AccessDeniedException : FileStorageException - { - public AccessDeniedException() : base() { } - public AccessDeniedException(string message) : base(message) { } - public AccessDeniedException(string message, Exception innerException) : base(message, innerException) { } - } + public AccessDeniedException() : base() { } + public AccessDeniedException(string message) : base(message) { } + public AccessDeniedException(string message, Exception innerException) : base(message, innerException) { } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Abstractions/Exceptions/DirectoryNotFoundException.cs b/src/ExtCore.FileStorage.Abstractions/Exceptions/DirectoryNotFoundException.cs index 8a925b4..0584731 100644 --- a/src/ExtCore.FileStorage.Abstractions/Exceptions/DirectoryNotFoundException.cs +++ b/src/ExtCore.FileStorage.Abstractions/Exceptions/DirectoryNotFoundException.cs @@ -3,15 +3,14 @@ using System; -namespace ExtCore.FileStorage +namespace ExtCore.FileStorage; + +/// +/// Represents a directory not found file storage exception. +/// +public class DirectoryNotFoundException : FileStorageException { - /// - /// Represents a directory not found file storage exception. - /// - public class DirectoryNotFoundException : FileStorageException - { - public DirectoryNotFoundException() : base() { } - public DirectoryNotFoundException(string message) : base(message) { } - public DirectoryNotFoundException(string message, Exception innerException) : base(message, innerException) { } - } + public DirectoryNotFoundException() : base() { } + public DirectoryNotFoundException(string message) : base(message) { } + public DirectoryNotFoundException(string message, Exception innerException) : base(message, innerException) { } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Abstractions/Exceptions/FileNotFoundException.cs b/src/ExtCore.FileStorage.Abstractions/Exceptions/FileNotFoundException.cs index 6d5c4d0..f4d1dbc 100644 --- a/src/ExtCore.FileStorage.Abstractions/Exceptions/FileNotFoundException.cs +++ b/src/ExtCore.FileStorage.Abstractions/Exceptions/FileNotFoundException.cs @@ -3,15 +3,14 @@ using System; -namespace ExtCore.FileStorage +namespace ExtCore.FileStorage; + +/// +/// Represents a directory not found file storage exception. +/// +public class FileNotFoundException : FileStorageException { - /// - /// Represents a directory not found file storage exception. - /// - public class FileNotFoundException : FileStorageException - { - public FileNotFoundException() : base() { } - public FileNotFoundException(string message) : base(message) { } - public FileNotFoundException(string message, Exception innerException) : base(message, innerException) { } - } + public FileNotFoundException() : base() { } + public FileNotFoundException(string message) : base(message) { } + public FileNotFoundException(string message, Exception innerException) : base(message, innerException) { } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Abstractions/Exceptions/FileStorageException.cs b/src/ExtCore.FileStorage.Abstractions/Exceptions/FileStorageException.cs index c0d203a..11d5c24 100644 --- a/src/ExtCore.FileStorage.Abstractions/Exceptions/FileStorageException.cs +++ b/src/ExtCore.FileStorage.Abstractions/Exceptions/FileStorageException.cs @@ -3,15 +3,14 @@ using System; -namespace ExtCore.FileStorage +namespace ExtCore.FileStorage; + +/// +/// Represents a generic file storage exception. +/// +public class FileStorageException : Exception { - /// - /// Represents a generic file storage exception. - /// - public class FileStorageException : Exception - { - public FileStorageException() : base() { } - public FileStorageException(string message) : base(message) { } - public FileStorageException(string message, Exception innerException) : base(message, innerException) { } - } + public FileStorageException() : base() { } + public FileStorageException(string message) : base(message) { } + public FileStorageException(string message, Exception innerException) : base(message, innerException) { } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Abstractions/Exceptions/PathTooLongException.cs b/src/ExtCore.FileStorage.Abstractions/Exceptions/PathTooLongException.cs index bf360fe..9d6e1aa 100644 --- a/src/ExtCore.FileStorage.Abstractions/Exceptions/PathTooLongException.cs +++ b/src/ExtCore.FileStorage.Abstractions/Exceptions/PathTooLongException.cs @@ -3,15 +3,14 @@ using System; -namespace ExtCore.FileStorage +namespace ExtCore.FileStorage; + +/// +/// Represents a path too long file storage exception. +/// +public class PathTooLongException : FileStorageException { - /// - /// Represents a path too long file storage exception. - /// - public class PathTooLongException : FileStorageException - { - public PathTooLongException() : base() { } - public PathTooLongException(string message) : base(message) { } - public PathTooLongException(string message, Exception innerException) : base(message, innerException) { } - } + public PathTooLongException() : base() { } + public PathTooLongException(string message) : base(message) { } + public PathTooLongException(string message, Exception innerException) : base(message, innerException) { } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Abstractions/FileStorageOptions.cs b/src/ExtCore.FileStorage.Abstractions/FileStorageOptions.cs index b480954..47c466d 100644 --- a/src/ExtCore.FileStorage.Abstractions/FileStorageOptions.cs +++ b/src/ExtCore.FileStorage.Abstractions/FileStorageOptions.cs @@ -1,31 +1,30 @@ // Copyright © 2018 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.FileStorage +namespace ExtCore.FileStorage; + +/// +/// Represents generic file storage options. +/// +public class FileStorageOptions { /// - /// Represents generic file storage options. + /// The origin that is used to connect to the file storage. Might be used to provide an API base URL. /// - public class FileStorageOptions - { - /// - /// The origin that is used to connect to the file storage. Might be used to provide an API base URL. - /// - public string Origin { get; set; } + public string Origin { get; set; } - /// - /// The identifier that is used to connect to the file storage. Might be used to provide a username or an application identifier. - /// - public string Identifier { get; set; } + /// + /// The identifier that is used to connect to the file storage. Might be used to provide a username or an application identifier. + /// + public string Identifier { get; set; } - /// - /// The secret that is used to connect to the file storage. Might be used to provide a password, an application secret, or an API key. - /// - public string Secret { get; set; } + /// + /// The secret that is used to connect to the file storage. Might be used to provide a password, an application secret, or an API key. + /// + public string Secret { get; set; } - /// - /// The root path that is used by the file storage. - /// - public string RootPath { get; set; } - } + /// + /// The root path that is used by the file storage. + /// + public string RootPath { get; set; } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Abstractions/IDirectoryProxy.cs b/src/ExtCore.FileStorage.Abstractions/IDirectoryProxy.cs index 501ac60..f504af5 100644 --- a/src/ExtCore.FileStorage.Abstractions/IDirectoryProxy.cs +++ b/src/ExtCore.FileStorage.Abstractions/IDirectoryProxy.cs @@ -5,73 +5,72 @@ using System.Collections.Generic; using System.Threading.Tasks; -namespace ExtCore.FileStorage.Abstractions +namespace ExtCore.FileStorage.Abstractions; + +/// +/// Describes a generic directory proxy to manipulate an underlying directory with a specified relative path. +/// +public interface IDirectoryProxy { /// - /// Describes a generic directory proxy to manipulate an underlying directory with a specified relative path. + /// The path of the underlying directory relatively to the root one. /// - public interface IDirectoryProxy - { - /// - /// The path of the underlying directory relatively to the root one. - /// - string RelativePath { get; } + string RelativePath { get; } - /// - /// Checks if the underlying directory exists. - /// - /// Returns a flag indicating if the underlying directory exists. - Task ExistsAsync(); + /// + /// Checks if the underlying directory exists. + /// + /// Returns a flag indicating if the underlying directory exists. + Task ExistsAsync(); - /// - /// Creates the underlying directory. - /// - /// - /// - /// - /// - Task CreateAsync(); + /// + /// Creates the underlying directory. + /// + /// + /// + /// + /// + Task CreateAsync(); - /// - /// Moves the underlying directory. - /// - /// - /// - /// - /// - /// - /// - /// - Task MoveAsync(string destinationRelativePath); + /// + /// Moves the underlying directory. + /// + /// + /// + /// + /// + /// + /// + /// + Task MoveAsync(string destinationRelativePath); - /// - /// Deletes the underlying directory. - /// - /// Pass true to remove all the underlying directory content recursively; otherwise false. - /// - /// - /// - /// - Task DeleteAsync(bool recursive); + /// + /// Deletes the underlying directory. + /// + /// Pass true to remove all the underlying directory content recursively; otherwise false. + /// + /// + /// + /// + Task DeleteAsync(bool recursive); - /// - /// Gets the directory proxies for the directories inside the underlying one. - /// - /// The directory proxies for the directories inside the underlying one - /// - /// - /// - /// - Task> GetDirectoryProxiesAsync(); + /// + /// Gets the directory proxies for the directories inside the underlying one. + /// + /// The directory proxies for the directories inside the underlying one + /// + /// + /// + /// + Task> GetDirectoryProxiesAsync(); - /// - /// Gets the file proxies for the files inside the underlying one. - /// - /// The file proxies for the files inside the underlying directory. - /// - /// - /// - /// - Task> GetFileProxiesAsync(); - } + /// + /// Gets the file proxies for the files inside the underlying one. + /// + /// The file proxies for the files inside the underlying directory. + /// + /// + /// + /// + Task> GetFileProxiesAsync(); } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Abstractions/IFileProxy.cs b/src/ExtCore.FileStorage.Abstractions/IFileProxy.cs index 059392a..c006c7f 100644 --- a/src/ExtCore.FileStorage.Abstractions/IFileProxy.cs +++ b/src/ExtCore.FileStorage.Abstractions/IFileProxy.cs @@ -5,103 +5,102 @@ using System.IO; using System.Threading.Tasks; -namespace ExtCore.FileStorage.Abstractions +namespace ExtCore.FileStorage.Abstractions; + +/// +/// Describes a generic file proxy to manipulate an underlying file with a specified relative path and a filename. +/// +public interface IFileProxy { /// - /// Describes a generic file proxy to manipulate an underlying file with a specified relative path and a filename. + /// The path of the underlying file relatively to the root one. /// - public interface IFileProxy - { - /// - /// The path of the underlying file relatively to the root one. - /// - string RelativePath { get; } + string RelativePath { get; } - /// - /// The filename of the underlying file. - /// - string Filename { get; } + /// + /// The filename of the underlying file. + /// + string Filename { get; } - /// - /// Checks if the underlying file exists. - /// - /// Returns a flag indicating if the underlying file exists. - Task ExistsAsync(); + /// + /// Checks if the underlying file exists. + /// + /// Returns a flag indicating if the underlying file exists. + Task ExistsAsync(); - /// - /// Reads content of the underlying file as a stream. - /// - /// Content of the underlying file as a stream. - /// - /// - /// - /// - /// - Task ReadStreamAsync(); + /// + /// Reads content of the underlying file as a stream. + /// + /// Content of the underlying file as a stream. + /// + /// + /// + /// + /// + Task ReadStreamAsync(); - /// - /// Reads content of the underlying file as a byte array. - /// - /// Content of the underlying file as a byte array. - /// - /// - /// - /// - /// - Task ReadBytesAsync(); + /// + /// Reads content of the underlying file as a byte array. + /// + /// Content of the underlying file as a byte array. + /// + /// + /// + /// + /// + Task ReadBytesAsync(); - /// - /// Reads content of the underlying file as a text string. - /// - /// Content of the underlying file as a text string. - /// - /// - /// - /// - /// - Task ReadTextAsync(); + /// + /// Reads content of the underlying file as a text string. + /// + /// Content of the underlying file as a text string. + /// + /// + /// + /// + /// + Task ReadTextAsync(); - /// - /// Writes content to the underlying file as a stream. - /// - /// Content to write to the underlying file as a stream. - /// - /// - /// - /// - /// - Task WriteStreamAsync(Stream inputStream); + /// + /// Writes content to the underlying file as a stream. + /// + /// Content to write to the underlying file as a stream. + /// + /// + /// + /// + /// + Task WriteStreamAsync(Stream inputStream); - /// - /// Writes content to the underlying file as a byte array. - /// - /// Content to write to the underlying file as a byte array. - /// - /// - /// - /// - /// - Task WriteBytesAsync(byte[] bytes); + /// + /// Writes content to the underlying file as a byte array. + /// + /// Content to write to the underlying file as a byte array. + /// + /// + /// + /// + /// + Task WriteBytesAsync(byte[] bytes); - /// - /// Writes content to the underlying file as a text string. - /// - /// Content to write to the underlying file as a text string. - /// - /// - /// - /// - /// - Task WriteTextAsync(string text); + /// + /// Writes content to the underlying file as a text string. + /// + /// Content to write to the underlying file as a text string. + /// + /// + /// + /// + /// + Task WriteTextAsync(string text); - /// - /// Deletes the underlying file. - /// - /// - /// - /// - /// - /// - Task DeleteAsync(); - } + /// + /// Deletes the underlying file. + /// + /// + /// + /// + /// + /// + Task DeleteAsync(); } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Abstractions/IFileStorage.cs b/src/ExtCore.FileStorage.Abstractions/IFileStorage.cs index 72b4cc8..722958a 100644 --- a/src/ExtCore.FileStorage.Abstractions/IFileStorage.cs +++ b/src/ExtCore.FileStorage.Abstractions/IFileStorage.cs @@ -1,26 +1,25 @@ // Copyright © 2018 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.FileStorage.Abstractions +namespace ExtCore.FileStorage.Abstractions; + +/// +/// Describes a generic file storage that allows to manipulate directories and files via proxies. +/// +public interface IFileStorage { /// - /// Describes a generic file storage that allows to manipulate directories and files via proxies. + /// Creates a directory proxy which allows to manipulate an underlying directory with a specified relative path. /// - public interface IFileStorage - { - /// - /// Creates a directory proxy which allows to manipulate an underlying directory with a specified relative path. - /// - /// The path of the underlying directory relatively to the root one. - /// Created directory proxy. - IDirectoryProxy CreateDirectoryProxy(string relativePath); + /// The path of the underlying directory relatively to the root one. + /// Created directory proxy. + IDirectoryProxy CreateDirectoryProxy(string relativePath); - /// - /// Creates a file proxy which allows to manipulate an underlying file with a specified relative path and a filename. - /// - /// The path of the underlying file relatively to the root one. - /// The filename of the underlying file. - /// Created file proxy. - IFileProxy CreateFileProxy(string relativePath, string filename); - } + /// + /// Creates a file proxy which allows to manipulate an underlying file with a specified relative path and a filename. + /// + /// The path of the underlying file relatively to the root one. + /// The filename of the underlying file. + /// Created file proxy. + IFileProxy CreateFileProxy(string relativePath, string filename); } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Azure/DirectoryProxy.cs b/src/ExtCore.FileStorage.Azure/DirectoryProxy.cs index 6e0be3d..d6b474b 100644 --- a/src/ExtCore.FileStorage.Azure/DirectoryProxy.cs +++ b/src/ExtCore.FileStorage.Azure/DirectoryProxy.cs @@ -10,216 +10,215 @@ using Azure.Storage.Blobs.Models; using ExtCore.FileStorage.Abstractions; -namespace ExtCore.FileStorage.Azure +namespace ExtCore.FileStorage.Azure; + +/// +/// Implements the IDirectoryProxy interface and represents a directory in a Azure Storage account. +/// +public class DirectoryProxy : IDirectoryProxy { + private readonly string connectionString; + private readonly string rootPath; + private readonly string path; + private readonly string containerName; + private readonly string prefix; + + /// + /// The path of the underlying directory relatively to the root one. + /// + public string RelativePath { get; private set; } + /// - /// Implements the IDirectoryProxy interface and represents a directory in a Azure Storage account. + /// Initializes a new instance of the DirectoryProxy class. /// - public class DirectoryProxy : IDirectoryProxy + /// The Azure Storage account connection string. + /// The root path of the underlying directory's relative one. + /// The path of the underlying directory relatively to the root one. + /// + /// + public DirectoryProxy(string connectionString, string rootPath, string relativePath) { - private readonly string connectionString; - private readonly string rootPath; - private readonly string path; - private readonly string containerName; - private readonly string prefix; - - /// - /// The path of the underlying directory relatively to the root one. - /// - public string RelativePath { get; private set; } - - /// - /// Initializes a new instance of the DirectoryProxy class. - /// - /// The Azure Storage account connection string. - /// The root path of the underlying directory's relative one. - /// The path of the underlying directory relatively to the root one. - /// - /// - public DirectoryProxy(string connectionString, string rootPath, string relativePath) - { - if (connectionString == string.Empty) - throw new ArgumentException($"Value can't be empty. Parameter name: connectionString."); + if (connectionString == string.Empty) + throw new ArgumentException($"Value can't be empty. Parameter name: connectionString."); - if (connectionString == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: connectionString.", default(Exception)); + if (connectionString == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: connectionString.", default(Exception)); - this.connectionString = connectionString; - this.rootPath = RelativeUrl.Combine(rootPath); - this.RelativePath = RelativeUrl.Combine(relativePath); - this.path = RelativeUrl.Combine(this.rootPath, this.RelativePath); + this.connectionString = connectionString; + this.rootPath = RelativeUrl.Combine(rootPath); + this.RelativePath = RelativeUrl.Combine(relativePath); + this.path = RelativeUrl.Combine(this.rootPath, this.RelativePath); - string[] urlSegments = path.Split('/'); + string[] urlSegments = path.Split('/'); - this.containerName = urlSegments.First(); - this.prefix = string.Join("/", urlSegments.Skip(1)); - } + this.containerName = urlSegments.First(); + this.prefix = string.Join("/", urlSegments.Skip(1)); + } - /// - /// Checks if the underlying directory exists. - /// - /// Returns a flag indicating if the underlying directory exists. - public async Task ExistsAsync() + /// + /// Checks if the underlying directory exists. + /// + /// Returns a flag indicating if the underlying directory exists. + public async Task ExistsAsync() + { + try { - try - { - BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); - IAsyncEnumerable> pages = blobContainerClient.GetBlobsByHierarchyAsync(prefix: this.prefix).AsPages(); + BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); + IAsyncEnumerable> pages = blobContainerClient.GetBlobsByHierarchyAsync(prefix: this.prefix).AsPages(); - await foreach (Page page in pages) - return page.Values.Count != 0; - } + await foreach (Page page in pages) + return page.Values.Count != 0; + } - catch { } + catch { } - return false; - } + return false; + } - /// - /// Creates the underlying directory. - /// - /// - /// - /// - /// - public async Task CreateAsync() - { - throw new NotSupportedException(); - } + /// + /// Creates the underlying directory. + /// + /// + /// + /// + /// + public async Task CreateAsync() + { + throw new NotSupportedException(); + } - /// - /// Moves the underlying directory. - /// - /// - /// - /// - /// - /// - /// - /// - public async Task MoveAsync(string destinationRelativePath) - { - throw new NotSupportedException(); - } + /// + /// Moves the underlying directory. + /// + /// + /// + /// + /// + /// + /// + /// + public async Task MoveAsync(string destinationRelativePath) + { + throw new NotSupportedException(); + } - /// - /// Deletes the underlying directory. - /// - /// Pass true to remove all the underlying directory content recursively; otherwise false. - /// - /// - /// - /// - public async Task DeleteAsync(bool recursive) + /// + /// Deletes the underlying directory. + /// + /// Pass true to remove all the underlying directory content recursively; otherwise false. + /// + /// + /// + /// + public async Task DeleteAsync(bool recursive) + { + try { - try - { - BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); + BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); - if (string.IsNullOrEmpty(this.prefix)) - { - await blobContainerClient.DeleteAsync(); - return; - } + if (string.IsNullOrEmpty(this.prefix)) + { + await blobContainerClient.DeleteAsync(); + return; + } - string prefix = this.prefix + "/"; - IAsyncEnumerable> pages = blobContainerClient.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: recursive ? null : "/").AsPages(); + string prefix = this.prefix + "/"; + IAsyncEnumerable> pages = blobContainerClient.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: recursive ? null : "/").AsPages(); - await foreach (Page page in pages) + await foreach (Page page in pages) + { + foreach (BlobHierarchyItem blobItem in page.Values) { - foreach (BlobHierarchyItem blobItem in page.Values) + if (blobItem.IsBlob) { - if (blobItem.IsBlob) - { - BlobClient blobClient = await this.GetBlobClient(blobItem.Blob); + BlobClient blobClient = await this.GetBlobClient(blobItem.Blob); - await blobClient.DeleteAsync(); - } + await blobClient.DeleteAsync(); } } } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } } - /// - /// Gets the directory proxies for the directories inside the underlying one. - /// - /// The directory proxies for the directories inside the underlying one - /// - /// - /// - /// - public async Task> GetDirectoryProxiesAsync() + catch (Exception e) { - try - { - IList directoryProxies = new List(); - BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); - string prefix = string.IsNullOrEmpty(this.prefix) ? null : this.prefix + "/"; - IAsyncEnumerable> pages = blobContainerClient.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: "/").AsPages(); + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } + } - await foreach (Page page in pages) - foreach (BlobHierarchyItem blobItem in page.Values) - if (blobItem.IsPrefix) - directoryProxies.Add(new DirectoryProxy(this.connectionString, this.rootPath, RelativeUrl.Combine(this.RelativePath, RelativeUrl.Combine(blobItem.Prefix).Split('/').Last()))); + /// + /// Gets the directory proxies for the directories inside the underlying one. + /// + /// The directory proxies for the directories inside the underlying one + /// + /// + /// + /// + public async Task> GetDirectoryProxiesAsync() + { + try + { + IList directoryProxies = new List(); + BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); + string prefix = string.IsNullOrEmpty(this.prefix) ? null : this.prefix + "/"; + IAsyncEnumerable> pages = blobContainerClient.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: "/").AsPages(); - return directoryProxies; - } + await foreach (Page page in pages) + foreach (BlobHierarchyItem blobItem in page.Values) + if (blobItem.IsPrefix) + directoryProxies.Add(new DirectoryProxy(this.connectionString, this.rootPath, RelativeUrl.Combine(this.RelativePath, RelativeUrl.Combine(blobItem.Prefix).Split('/').Last()))); - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } + return directoryProxies; } - /// - /// Gets the file proxies for the files inside the underlying one. - /// - /// The file proxies for the files inside the underlying directory. - /// - /// - /// - /// - public async Task> GetFileProxiesAsync() + catch (Exception e) { - try - { - IList fileProxies = new List(); - BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); - string prefix = string.IsNullOrEmpty(this.prefix) ? null : this.prefix + "/"; - IAsyncEnumerable> pages = blobContainerClient.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: "/").AsPages(); + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } + } - await foreach (Page page in pages) - foreach (BlobHierarchyItem blobItem in page.Values) - if (blobItem.IsBlob) - fileProxies.Add(new FileProxy(this.connectionString, this.rootPath, this.RelativePath, blobItem.Blob.Name.Split('/').Last())); + /// + /// Gets the file proxies for the files inside the underlying one. + /// + /// The file proxies for the files inside the underlying directory. + /// + /// + /// + /// + public async Task> GetFileProxiesAsync() + { + try + { + IList fileProxies = new List(); + BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); + string prefix = string.IsNullOrEmpty(this.prefix) ? null : this.prefix + "/"; + IAsyncEnumerable> pages = blobContainerClient.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: "/").AsPages(); - return fileProxies; - } + await foreach (Page page in pages) + foreach (BlobHierarchyItem blobItem in page.Values) + if (blobItem.IsBlob) + fileProxies.Add(new FileProxy(this.connectionString, this.rootPath, this.RelativePath, blobItem.Blob.Name.Split('/').Last())); - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } + return fileProxies; } - private BlobContainerClient GetBlobContainerClient() + catch (Exception e) { - BlobServiceClient blobServiceClient = new BlobServiceClient(this.connectionString); - - return blobServiceClient.GetBlobContainerClient(this.containerName); + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); } + } - private async Task GetBlobClient(BlobItem blobItem) - { - BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); + private BlobContainerClient GetBlobContainerClient() + { + BlobServiceClient blobServiceClient = new BlobServiceClient(this.connectionString); - await blobContainerClient.CreateIfNotExistsAsync(); - return blobContainerClient.GetBlobClient(blobItem.Name); - } + return blobServiceClient.GetBlobContainerClient(this.containerName); + } + + private async Task GetBlobClient(BlobItem blobItem) + { + BlobContainerClient blobContainerClient = this.GetBlobContainerClient(); + + await blobContainerClient.CreateIfNotExistsAsync(); + return blobContainerClient.GetBlobClient(blobItem.Name); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Azure/FileProxy.cs b/src/ExtCore.FileStorage.Azure/FileProxy.cs index b95a2ba..9fced27 100644 --- a/src/ExtCore.FileStorage.Azure/FileProxy.cs +++ b/src/ExtCore.FileStorage.Azure/FileProxy.cs @@ -9,260 +9,259 @@ using Azure.Storage.Blobs.Models; using ExtCore.FileStorage.Abstractions; -namespace ExtCore.FileStorage.Azure +namespace ExtCore.FileStorage.Azure; + +/// +/// Implements the IDirectoryProxy interface and represents a file in a Azure Storage account. +/// +public class FileProxy : IFileProxy { + private readonly string connectionString; + private readonly string filepath; + private readonly string containerName; + private readonly string blobName; + + /// + /// The path of the underlying file relatively to the root one. + /// + public string RelativePath { get; private set; } + + /// + /// The filename of the underlying file. + /// + public string Filename { get; private set; } + /// - /// Implements the IDirectoryProxy interface and represents a file in a Azure Storage account. + /// Initializes a new instance of the FileProxy class. /// - public class FileProxy : IFileProxy + /// The Azure Storage account connection string. + /// The root path of the underlying file's relative one. + /// The path of the underlying file relatively to the root one. + /// The filename of the underlying file. + /// + /// + public FileProxy(string connectionString, string rootPath, string relativePath, string filename) { - private readonly string connectionString; - private readonly string filepath; - private readonly string containerName; - private readonly string blobName; - - /// - /// The path of the underlying file relatively to the root one. - /// - public string RelativePath { get; private set; } - - /// - /// The filename of the underlying file. - /// - public string Filename { get; private set; } - - /// - /// Initializes a new instance of the FileProxy class. - /// - /// The Azure Storage account connection string. - /// The root path of the underlying file's relative one. - /// The path of the underlying file relatively to the root one. - /// The filename of the underlying file. - /// - /// - public FileProxy(string connectionString, string rootPath, string relativePath, string filename) - { - if (connectionString == string.Empty) - throw new ArgumentException($"Value can't be empty. Parameter name: connectionString."); + if (connectionString == string.Empty) + throw new ArgumentException($"Value can't be empty. Parameter name: connectionString."); + + if (connectionString == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: connectionString.", default(Exception)); - if (connectionString == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: connectionString.", default(Exception)); + if (filename == string.Empty) + throw new ArgumentException($"Value can't be empty. Parameter name: filename."); - if (filename == string.Empty) - throw new ArgumentException($"Value can't be empty. Parameter name: filename."); + if (filename == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: filename.", default(Exception)); - if (filename == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: filename.", default(Exception)); + this.connectionString = connectionString; + this.RelativePath = RelativeUrl.Combine(relativePath); + this.Filename = filename; + this.filepath = RelativeUrl.Combine(rootPath, this.RelativePath, this.Filename); - this.connectionString = connectionString; - this.RelativePath = RelativeUrl.Combine(relativePath); - this.Filename = filename; - this.filepath = RelativeUrl.Combine(rootPath, this.RelativePath, this.Filename); + string[] urlSegments = filepath.Split('/'); + + this.containerName = urlSegments.First(); + this.blobName = string.Join("/", urlSegments.Skip(1)); + } - string[] urlSegments = filepath.Split('/'); + /// + /// Checks if the underlying file exists. + /// + /// Returns a flag indicating if the underlying file exists. + public async Task ExistsAsync() + { + try + { + BlobClient blobClient = await this.GetBlobClient(); - this.containerName = urlSegments.First(); - this.blobName = string.Join("/", urlSegments.Skip(1)); + return await blobClient.ExistsAsync(); } - /// - /// Checks if the underlying file exists. - /// - /// Returns a flag indicating if the underlying file exists. - public async Task ExistsAsync() + catch { - try - { - BlobClient blobClient = await this.GetBlobClient(); + return false; + } + } - return await blobClient.ExistsAsync(); - } + /// + /// Reads content of the underlying file as a byte array. + /// + /// Content of the underlying file as a byte array. + /// + /// + /// + /// + /// + public async Task ReadStreamAsync() + { + try + { + BlobClient blobClient = await this.GetBlobClient(); + MemoryStream stream = new MemoryStream(); - catch - { - return false; - } + await blobClient.DownloadToAsync(stream); + stream.Position = 0; + return stream; } - /// - /// Reads content of the underlying file as a byte array. - /// - /// Content of the underlying file as a byte array. - /// - /// - /// - /// - /// - public async Task ReadStreamAsync() + catch (Exception e) { - try - { - BlobClient blobClient = await this.GetBlobClient(); - MemoryStream stream = new MemoryStream(); - - await blobClient.DownloadToAsync(stream); - stream.Position = 0; - return stream; - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Reads content of the underlying file as a byte array. - /// - /// Content of the underlying file as a byte array. - /// - /// - /// - /// - /// - public async Task ReadBytesAsync() + /// + /// Reads content of the underlying file as a byte array. + /// + /// Content of the underlying file as a byte array. + /// + /// + /// + /// + /// + public async Task ReadBytesAsync() + { + try { - try - { - BlobClient blobClient = await this.GetBlobClient(); - BlobDownloadResult downloadResult = await blobClient.DownloadContentAsync(); - - return downloadResult.Content.ToArray(); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + BlobClient blobClient = await this.GetBlobClient(); + BlobDownloadResult downloadResult = await blobClient.DownloadContentAsync(); + + return downloadResult.Content.ToArray(); } - /// - /// Reads content of the underlying file as a text string. - /// - /// Content of the underlying file as a text string. - /// - /// - /// - /// - /// - public async Task ReadTextAsync() + catch (Exception e) { - try - { - BlobClient blobClient = await this.GetBlobClient(); - BlobDownloadResult downloadResult = await blobClient.DownloadContentAsync(); - - return downloadResult.Content.ToString(); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Writes content to the underlying file as a stream. - /// - /// Content to write to the underlying file as a stream. - /// - /// - /// - /// - /// - public async Task WriteStreamAsync(Stream inputStream) + /// + /// Reads content of the underlying file as a text string. + /// + /// Content of the underlying file as a text string. + /// + /// + /// + /// + /// + public async Task ReadTextAsync() + { + try { - try - { - BlobClient blobClient = await this.GetBlobClient(); + BlobClient blobClient = await this.GetBlobClient(); + BlobDownloadResult downloadResult = await blobClient.DownloadContentAsync(); - await blobClient.UploadAsync(inputStream); - } + return downloadResult.Content.ToString(); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Writes content to the underlying file as a byte array. - /// - /// Content to write to the underlying file as a byte array. - /// - /// - /// - /// - /// - public async Task WriteBytesAsync(byte[] bytes) + /// + /// Writes content to the underlying file as a stream. + /// + /// Content to write to the underlying file as a stream. + /// + /// + /// + /// + /// + public async Task WriteStreamAsync(Stream inputStream) + { + try { - try - { - BlobClient blobClient = await this.GetBlobClient(); + BlobClient blobClient = await this.GetBlobClient(); - await blobClient.UploadAsync(BinaryData.FromBytes(bytes)); - } + await blobClient.UploadAsync(inputStream); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Writes content to the underlying file as a text string. - /// - /// Content to write to the underlying file as a text string. - /// - /// - /// - /// - /// - public async Task WriteTextAsync(string text) + /// + /// Writes content to the underlying file as a byte array. + /// + /// Content to write to the underlying file as a byte array. + /// + /// + /// + /// + /// + public async Task WriteBytesAsync(byte[] bytes) + { + try { - try - { - BlobClient blobClient = await this.GetBlobClient(); + BlobClient blobClient = await this.GetBlobClient(); - await blobClient.UploadAsync(BinaryData.FromString(text)); - } + await blobClient.UploadAsync(BinaryData.FromBytes(bytes)); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Deletes the underlying file. - /// - /// - /// - /// - /// - /// - public async Task DeleteAsync() + /// + /// Writes content to the underlying file as a text string. + /// + /// Content to write to the underlying file as a text string. + /// + /// + /// + /// + /// + public async Task WriteTextAsync(string text) + { + try { - try - { - BlobClient blobClient = await this.GetBlobClient(); + BlobClient blobClient = await this.GetBlobClient(); - await blobClient.DeleteAsync(); - } + await blobClient.UploadAsync(BinaryData.FromString(text)); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - private async Task GetBlobClient() + /// + /// Deletes the underlying file. + /// + /// + /// + /// + /// + /// + public async Task DeleteAsync() + { + try { - BlobServiceClient blobServiceClient = new BlobServiceClient(this.connectionString); - BlobContainerClient blobContainerClient = blobServiceClient.GetBlobContainerClient(this.containerName); + BlobClient blobClient = await this.GetBlobClient(); - await blobContainerClient.CreateIfNotExistsAsync(); - return blobContainerClient.GetBlobClient(this.blobName); + await blobClient.DeleteAsync(); } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } + } + + private async Task GetBlobClient() + { + BlobServiceClient blobServiceClient = new BlobServiceClient(this.connectionString); + BlobContainerClient blobContainerClient = blobServiceClient.GetBlobContainerClient(this.containerName); + + await blobContainerClient.CreateIfNotExistsAsync(); + return blobContainerClient.GetBlobClient(this.blobName); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Azure/FileStorage.cs b/src/ExtCore.FileStorage.Azure/FileStorage.cs index 71868e1..b5a9b2b 100644 --- a/src/ExtCore.FileStorage.Azure/FileStorage.cs +++ b/src/ExtCore.FileStorage.Azure/FileStorage.cs @@ -4,45 +4,44 @@ using ExtCore.FileStorage.Abstractions; using Microsoft.Extensions.Options; -namespace ExtCore.FileStorage.Azure +namespace ExtCore.FileStorage.Azure; + +/// +/// Implements the IFileStorage interface and represents a file storage in a Azure Storage account. +/// +public class FileStorage : IFileStorage { + private readonly string secret; + private readonly string rootPath; + /// - /// Implements the IFileStorage interface and represents a file storage in a Azure Storage account. + /// Initializes a new instance of the FileStorage class. /// - public class FileStorage : IFileStorage + /// The options that are used to configure the file storage root path. + public FileStorage(IOptions options) { - private readonly string secret; - private readonly string rootPath; - - /// - /// Initializes a new instance of the FileStorage class. - /// - /// The options that are used to configure the file storage root path. - public FileStorage(IOptions options) - { - this.secret = options.Value.Secret; - this.rootPath = options.Value.RootPath; - } + this.secret = options.Value.Secret; + this.rootPath = options.Value.RootPath; + } - /// - /// Creates a directory proxy which allows to manipulate an underlying directory with a specified relative path. - /// - /// The path of the underlying directory relatively to the root one. - /// Created directory proxy. - public IDirectoryProxy CreateDirectoryProxy(string relativePath) - { - return new DirectoryProxy(this.secret, this.rootPath, relativePath); - } + /// + /// Creates a directory proxy which allows to manipulate an underlying directory with a specified relative path. + /// + /// The path of the underlying directory relatively to the root one. + /// Created directory proxy. + public IDirectoryProxy CreateDirectoryProxy(string relativePath) + { + return new DirectoryProxy(this.secret, this.rootPath, relativePath); + } - /// - /// Creates a file proxy which allows to manipulate an underlying file with a specified relative path and a filename. - /// - /// The path of the underlying file relatively to the root one. - /// The filename of the underlying file. - /// Created file proxy. - public IFileProxy CreateFileProxy(string relativePath, string filename) - { - return new FileProxy(this.secret, this.rootPath, relativePath, filename); - } + /// + /// Creates a file proxy which allows to manipulate an underlying file with a specified relative path and a filename. + /// + /// The path of the underlying file relatively to the root one. + /// The filename of the underlying file. + /// Created file proxy. + public IFileProxy CreateFileProxy(string relativePath, string filename) + { + return new FileProxy(this.secret, this.rootPath, relativePath, filename); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Azure/RelativeUrl.cs b/src/ExtCore.FileStorage.Azure/RelativeUrl.cs index b220ecf..539139f 100644 --- a/src/ExtCore.FileStorage.Azure/RelativeUrl.cs +++ b/src/ExtCore.FileStorage.Azure/RelativeUrl.cs @@ -4,18 +4,17 @@ using System; using System.Linq; -namespace ExtCore.FileStorage.Azure +namespace ExtCore.FileStorage.Azure; + +public static class RelativeUrl { - public static class RelativeUrl + public static string Combine(params string[] segments) { - public static string Combine(params string[] segments) - { - return string.Join( - "/", - segments.Where(s => !string.IsNullOrEmpty(s)).Select( - s => string.Join("/", s.Split(new char[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries)) - ).Where(s => !string.IsNullOrEmpty(s)) - ); - } + return string.Join( + "/", + segments.Where(s => !string.IsNullOrEmpty(s)).Select( + s => string.Join("/", s.Split(new char[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries)) + ).Where(s => !string.IsNullOrEmpty(s)) + ); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Dropbox/DirectoryProxy.cs b/src/ExtCore.FileStorage.Dropbox/DirectoryProxy.cs index bfb15f1..f18de8c 100644 --- a/src/ExtCore.FileStorage.Dropbox/DirectoryProxy.cs +++ b/src/ExtCore.FileStorage.Dropbox/DirectoryProxy.cs @@ -9,144 +9,178 @@ using Dropbox.Api.Files; using ExtCore.FileStorage.Abstractions; -namespace ExtCore.FileStorage.Dropbox +namespace ExtCore.FileStorage.Dropbox; + +/// +/// Implements the IDirectoryProxy interface and represents a directory in a Dropbox account. +/// +public class DirectoryProxy : IDirectoryProxy { + private readonly string accessToken; + private readonly string rootPath; + private readonly string path; + /// - /// Implements the IDirectoryProxy interface and represents a directory in a Dropbox account. + /// The path of the underlying directory relatively to the root one. /// - public class DirectoryProxy : IDirectoryProxy + public string RelativePath { get; private set; } + + /// + /// Initializes a new instance of the DirectoryProxy class. + /// + /// The Dropbox's account access token. + /// The root path of the underlying directory's relative one. + /// The path of the underlying directory relatively to the root one. + /// + /// + public DirectoryProxy(string accessToken, string rootPath, string relativePath) { - private readonly string accessToken; - private readonly string rootPath; - private readonly string path; - - /// - /// The path of the underlying directory relatively to the root one. - /// - public string RelativePath { get; private set; } - - /// - /// Initializes a new instance of the DirectoryProxy class. - /// - /// The Dropbox's account access token. - /// The root path of the underlying directory's relative one. - /// The path of the underlying directory relatively to the root one. - /// - /// - public DirectoryProxy(string accessToken, string rootPath, string relativePath) - { - if (accessToken == string.Empty) - throw new ArgumentException($"Value can't be empty. Parameter name: accessToken."); + if (accessToken == string.Empty) + throw new ArgumentException($"Value can't be empty. Parameter name: accessToken."); - if (accessToken == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: accessToken.", default(Exception)); + if (accessToken == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: accessToken.", default(Exception)); - this.accessToken = accessToken; - this.rootPath = RelativeUrl.Combine(rootPath); - this.RelativePath = RelativeUrl.Combine(relativePath); - this.path = RelativeUrl.Combine(this.rootPath, this.RelativePath); + this.accessToken = accessToken; + this.rootPath = RelativeUrl.Combine(rootPath); + this.RelativePath = RelativeUrl.Combine(relativePath); + this.path = RelativeUrl.Combine(this.rootPath, this.RelativePath); - if (string.Equals(this.path, "/")) - this.path = string.Empty; - } + if (string.Equals(this.path, "/")) + this.path = string.Empty; + } - /// - /// Checks if the underlying directory exists. - /// - /// Returns a flag indicating if the underlying directory exists. - public async Task ExistsAsync() + /// + /// Checks if the underlying directory exists. + /// + /// Returns a flag indicating if the underlying directory exists. + public async Task ExistsAsync() + { + try { - try + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - { - Metadata metadata = await dropboxClient.Files.GetMetadataAsync(this.path); + Metadata metadata = await dropboxClient.Files.GetMetadataAsync(this.path); - return metadata.IsFolder; - } + return metadata.IsFolder; } + } + + catch { return false; } + } - catch { return false; } + /// + /// Creates the underlying directory. + /// + /// + /// + /// + /// + public async Task CreateAsync() + { + try + { + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) + await dropboxClient.Files.CreateFolderV2Async(this.path); } - /// - /// Creates the underlying directory. - /// - /// - /// - /// - /// - public async Task CreateAsync() + catch (Exception e) { - try - { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - await dropboxClient.Files.CreateFolderV2Async(this.path); - } + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } + /// + /// Moves the underlying directory. + /// + /// + /// + /// + /// + /// + /// + /// + public async Task MoveAsync(string destinationRelativePath) + { + if (destinationRelativePath == string.Empty) + throw new ArgumentException($"Value can't be empty. Parameter name: destinationRelativePath."); + + if (destinationRelativePath == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: destinationRelativePath.", default(Exception)); + + try + { + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) + await dropboxClient.Files.MoveV2Async(this.path, RelativeUrl.Combine(this.rootPath, destinationRelativePath)); } - /// - /// Moves the underlying directory. - /// - /// - /// - /// - /// - /// - /// - /// - public async Task MoveAsync(string destinationRelativePath) + catch (ApiException e) { - if (destinationRelativePath == string.Empty) - throw new ArgumentException($"Value can't be empty. Parameter name: destinationRelativePath."); + if (e.ErrorResponse.IsFromLookup) + throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); - if (destinationRelativePath == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: destinationRelativePath.", default(Exception)); + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } - try - { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - await dropboxClient.Files.MoveV2Async(this.path, RelativeUrl.Combine(this.rootPath, destinationRelativePath)); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } + } - catch (ApiException e) - { - if (e.ErrorResponse.IsFromLookup) - throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); + /// + /// Deletes the underlying directory. + /// + /// Pass true to remove all the underlying directory content recursively; otherwise false. + /// + /// + /// + /// + public async Task DeleteAsync(bool recursive) + { + try + { + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) + await dropboxClient.Files.DeleteV2Async(this.path); + } - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } + catch (ApiException e) + { + if (e.ErrorResponse.IsPathLookup) + throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); } + } - /// - /// Deletes the underlying directory. - /// - /// Pass true to remove all the underlying directory content recursively; otherwise false. - /// - /// - /// - /// - public async Task DeleteAsync(bool recursive) + /// + /// Gets the directory proxies for the directories inside the underlying one. + /// + /// The directory proxies for the directories inside the underlying one + /// + /// + /// + /// + public async Task> GetDirectoryProxiesAsync() + { + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) { + IList directoryProxies = new List(); + try { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - await dropboxClient.Files.DeleteV2Async(this.path); + foreach (Metadata metadata in (await dropboxClient.Files.ListFolderAsync(this.path)).Entries.Where(m => m.IsFolder)) + directoryProxies.Add(new DirectoryProxy(this.accessToken, this.rootPath, metadata.PathDisplay.Substring(this.rootPath.Length))); } - catch (ApiException e) + catch (ApiException e) { - if (e.ErrorResponse.IsPathLookup) + if (e.ErrorResponse.IsPath) throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); @@ -156,89 +190,54 @@ public async Task DeleteAsync(bool recursive) { throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); } + + return directoryProxies; } + } - /// - /// Gets the directory proxies for the directories inside the underlying one. - /// - /// The directory proxies for the directories inside the underlying one - /// - /// - /// - /// - public async Task> GetDirectoryProxiesAsync() + /// + /// Gets the file proxies for the files inside the underlying one. + /// + /// The file proxies for the files inside the underlying directory. + /// + /// + /// + /// + public async Task> GetFileProxiesAsync() + { + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - { - IList directoryProxies = new List(); + IList fileProxies = new List(); - try + try + { + foreach (Metadata metadata in (await dropboxClient.Files.ListFolderAsync(this.path)).Entries.Where(m => m.IsFile)) { - foreach (Metadata metadata in (await dropboxClient.Files.ListFolderAsync(this.path)).Entries.Where(m => m.IsFolder)) - directoryProxies.Add(new DirectoryProxy(this.accessToken, this.rootPath, metadata.PathDisplay.Substring(this.rootPath.Length))); - } + string relativePath = metadata.PathDisplay; - catch (ApiException e) - { - if (e.ErrorResponse.IsPath) - throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); + relativePath = relativePath.Substring(this.rootPath.Length); - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } + if (relativePath.Contains("/")) + relativePath = relativePath.Remove(relativePath.LastIndexOf("/")); - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + fileProxies.Add(new FileProxy(this.accessToken, this.rootPath, relativePath, metadata.Name)); } - - return directoryProxies; } - } - /// - /// Gets the file proxies for the files inside the underlying one. - /// - /// The file proxies for the files inside the underlying directory. - /// - /// - /// - /// - public async Task> GetFileProxiesAsync() - { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) + catch (ApiException e) { - IList fileProxies = new List(); - - try - { - foreach (Metadata metadata in (await dropboxClient.Files.ListFolderAsync(this.path)).Entries.Where(m => m.IsFile)) - { - string relativePath = metadata.PathDisplay; - - relativePath = relativePath.Substring(this.rootPath.Length); - - if (relativePath.Contains("/")) - relativePath = relativePath.Remove(relativePath.LastIndexOf("/")); - - fileProxies.Add(new FileProxy(this.accessToken, this.rootPath, relativePath, metadata.Name)); - } - } - - catch (ApiException e) - { - if (e.ErrorResponse.IsPath) - throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); - - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } + if (e.ErrorResponse.IsPath) + throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } - return fileProxies; + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); } + + return fileProxies; } } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Dropbox/FileProxy.cs b/src/ExtCore.FileStorage.Dropbox/FileProxy.cs index 7507606..e4fe2d1 100644 --- a/src/ExtCore.FileStorage.Dropbox/FileProxy.cs +++ b/src/ExtCore.FileStorage.Dropbox/FileProxy.cs @@ -10,268 +10,267 @@ using Dropbox.Api.Stone; using ExtCore.FileStorage.Abstractions; -namespace ExtCore.FileStorage.Dropbox +namespace ExtCore.FileStorage.Dropbox; + +/// +/// Implements the IDirectoryProxy interface and represents a file in a Dropbox account. +/// +public class FileProxy : IFileProxy { + private readonly string accessToken; + private readonly string rootPath; + private readonly string filepath; + /// - /// Implements the IDirectoryProxy interface and represents a file in a Dropbox account. + /// The path of the underlying file relatively to the root one. /// - public class FileProxy : IFileProxy + public string RelativePath { get; private set; } + + /// + /// The filename of the underlying file. + /// + public string Filename { get; private set; } + + /// + /// Initializes a new instance of the FileProxy class. + /// + /// The Dropbox's account access token. + /// The root path of the underlying file's relative one. + /// The path of the underlying file relatively to the root one. + /// The filename of the underlying file. + /// + /// + public FileProxy(string accessToken, string rootPath, string relativePath, string filename) { - private readonly string accessToken; - private readonly string rootPath; - private readonly string filepath; - - /// - /// The path of the underlying file relatively to the root one. - /// - public string RelativePath { get; private set; } - - /// - /// The filename of the underlying file. - /// - public string Filename { get; private set; } - - /// - /// Initializes a new instance of the FileProxy class. - /// - /// The Dropbox's account access token. - /// The root path of the underlying file's relative one. - /// The path of the underlying file relatively to the root one. - /// The filename of the underlying file. - /// - /// - public FileProxy(string accessToken, string rootPath, string relativePath, string filename) - { - if (accessToken == string.Empty) - throw new ArgumentException($"Value can't be empty. Parameter name: accessToken."); + if (accessToken == string.Empty) + throw new ArgumentException($"Value can't be empty. Parameter name: accessToken."); - if (accessToken == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: accessToken.", default(Exception)); + if (accessToken == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: accessToken.", default(Exception)); - if (filename == string.Empty) - throw new ArgumentException($"Value can't be empty. Parameter name: filename."); + if (filename == string.Empty) + throw new ArgumentException($"Value can't be empty. Parameter name: filename."); - if (filename == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: filename.", default(Exception)); + if (filename == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: filename.", default(Exception)); - this.accessToken = accessToken; - this.rootPath = RelativeUrl.Combine(rootPath); - this.RelativePath = RelativeUrl.Combine(relativePath); - this.Filename = filename; - this.filepath = RelativeUrl.Combine(this.rootPath, this.RelativePath, this.Filename); - } + this.accessToken = accessToken; + this.rootPath = RelativeUrl.Combine(rootPath); + this.RelativePath = RelativeUrl.Combine(relativePath); + this.Filename = filename; + this.filepath = RelativeUrl.Combine(this.rootPath, this.RelativePath, this.Filename); + } - /// - /// Checks if the underlying file exists. - /// - /// Returns a flag indicating if the underlying file exists. - public async Task ExistsAsync() + /// + /// Checks if the underlying file exists. + /// + /// Returns a flag indicating if the underlying file exists. + public async Task ExistsAsync() + { + try { - try + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - { - Metadata metadata = await dropboxClient.Files.GetMetadataAsync(this.filepath); + Metadata metadata = await dropboxClient.Files.GetMetadataAsync(this.filepath); - return metadata.IsFile; - } + return metadata.IsFile; } - - catch { return false; } } - /// - /// Reads content of the underlying file as a byte array. - /// - /// Content of the underlying file as a byte array. - /// - /// - /// - /// - /// - public async Task ReadStreamAsync() + catch { return false; } + } + + /// + /// Reads content of the underlying file as a byte array. + /// + /// Content of the underlying file as a byte array. + /// + /// + /// + /// + /// + public async Task ReadStreamAsync() + { + try { - try - { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - using (IDownloadResponse response = await dropboxClient.Files.DownloadAsync(this.filepath)) - return await response.GetContentAsStreamAsync(); - } + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) + using (IDownloadResponse response = await dropboxClient.Files.DownloadAsync(this.filepath)) + return await response.GetContentAsStreamAsync(); + } - catch (ApiException e) - { - if (e.ErrorResponse.IsPath) - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + catch (ApiException e) + { + if (e.ErrorResponse.IsPath) + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Reads content of the underlying file as a byte array. - /// - /// Content of the underlying file as a byte array. - /// - /// - /// - /// - /// - public async Task ReadBytesAsync() + /// + /// Reads content of the underlying file as a byte array. + /// + /// Content of the underlying file as a byte array. + /// + /// + /// + /// + /// + public async Task ReadBytesAsync() + { + try { - try - { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - using (IDownloadResponse response = await dropboxClient.Files.DownloadAsync(this.filepath)) - return await response.GetContentAsByteArrayAsync(); - } + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) + using (IDownloadResponse response = await dropboxClient.Files.DownloadAsync(this.filepath)) + return await response.GetContentAsByteArrayAsync(); + } - catch (ApiException e) - { - if (e.ErrorResponse.IsPath) - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + catch (ApiException e) + { + if (e.ErrorResponse.IsPath) + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Reads content of the underlying file as a text string. - /// - /// Content of the underlying file as a text string. - /// - /// - /// - /// - /// - public async Task ReadTextAsync() + /// + /// Reads content of the underlying file as a text string. + /// + /// Content of the underlying file as a text string. + /// + /// + /// + /// + /// + public async Task ReadTextAsync() + { + try { - try - { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - using (IDownloadResponse response = await dropboxClient.Files.DownloadAsync(this.filepath)) - return await response.GetContentAsStringAsync(); - } + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) + using (IDownloadResponse response = await dropboxClient.Files.DownloadAsync(this.filepath)) + return await response.GetContentAsStringAsync(); + } - catch (ApiException e) - { - if (e.ErrorResponse.IsPath) - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + catch (ApiException e) + { + if (e.ErrorResponse.IsPath) + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Writes content to the underlying file as a stream. - /// - /// Content to write to the underlying file as a stream. - /// - /// - /// - /// - /// - public async Task WriteStreamAsync(Stream inputStream) + /// + /// Writes content to the underlying file as a stream. + /// + /// Content to write to the underlying file as a stream. + /// + /// + /// + /// + /// + public async Task WriteStreamAsync(Stream inputStream) + { + try { - try - { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - await dropboxClient.Files.UploadAsync(this.filepath, WriteMode.Overwrite.Instance, body: inputStream); - } + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) + await dropboxClient.Files.UploadAsync(this.filepath, WriteMode.Overwrite.Instance, body: inputStream); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Writes content to the underlying file as a byte array. - /// - /// Content to write to the underlying file as a byte array. - /// - /// - /// - /// - /// - public async Task WriteBytesAsync(byte[] bytes) + /// + /// Writes content to the underlying file as a byte array. + /// + /// Content to write to the underlying file as a byte array. + /// + /// + /// + /// + /// + public async Task WriteBytesAsync(byte[] bytes) + { + try { - try - { - using (MemoryStream inputStream = new MemoryStream(bytes)) - await this.WriteStreamAsync(inputStream); - } + using (MemoryStream inputStream = new MemoryStream(bytes)) + await this.WriteStreamAsync(inputStream); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Writes content to the underlying file as a text string. - /// - /// Content to write to the underlying file as a text string. - /// - /// - /// - /// - /// - public async Task WriteTextAsync(string text) + /// + /// Writes content to the underlying file as a text string. + /// + /// Content to write to the underlying file as a text string. + /// + /// + /// + /// + /// + public async Task WriteTextAsync(string text) + { + try { - try - { - await this.WriteBytesAsync(Encoding.UTF8.GetBytes(text)); - } + await this.WriteBytesAsync(Encoding.UTF8.GetBytes(text)); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } + } - /// - /// Deletes the underlying file. - /// - /// - /// - /// - /// - /// - public async Task DeleteAsync() + /// + /// Deletes the underlying file. + /// + /// + /// + /// + /// + /// + public async Task DeleteAsync() + { + try { - try - { - using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) - await dropboxClient.Files.DeleteV2Async(this.filepath); - } + using (DropboxClient dropboxClient = new DropboxClient(this.accessToken)) + await dropboxClient.Files.DeleteV2Async(this.filepath); + } - catch (ApiException e) - { - if (e.ErrorResponse.IsPath) - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + catch (ApiException e) + { + if (e.ErrorResponse.IsPath) + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); } } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Dropbox/FileStorage.cs b/src/ExtCore.FileStorage.Dropbox/FileStorage.cs index 4df55ab..ab5f7a2 100644 --- a/src/ExtCore.FileStorage.Dropbox/FileStorage.cs +++ b/src/ExtCore.FileStorage.Dropbox/FileStorage.cs @@ -4,45 +4,44 @@ using ExtCore.FileStorage.Abstractions; using Microsoft.Extensions.Options; -namespace ExtCore.FileStorage.Dropbox +namespace ExtCore.FileStorage.Dropbox; + +/// +/// Implements the IFileStorage interface and represents a file storage in a Dropbox account. +/// +public class FileStorage : IFileStorage { + private readonly string secret; + private readonly string rootPath; + /// - /// Implements the IFileStorage interface and represents a file storage in a Dropbox account. + /// Initializes a new instance of the FileStorage class. /// - public class FileStorage : IFileStorage + /// The options that are used to configure the file storage root path. + public FileStorage(IOptions options) { - private readonly string secret; - private readonly string rootPath; - - /// - /// Initializes a new instance of the FileStorage class. - /// - /// The options that are used to configure the file storage root path. - public FileStorage(IOptions options) - { - this.secret = options.Value.Secret; - this.rootPath = options.Value.RootPath; - } + this.secret = options.Value.Secret; + this.rootPath = options.Value.RootPath; + } - /// - /// Creates a directory proxy which allows to manipulate an underlying directory with a specified relative path. - /// - /// The path of the underlying directory relatively to the root one. - /// Created directory proxy. - public IDirectoryProxy CreateDirectoryProxy(string relativePath) - { - return new DirectoryProxy(this.secret, this.rootPath, relativePath); - } + /// + /// Creates a directory proxy which allows to manipulate an underlying directory with a specified relative path. + /// + /// The path of the underlying directory relatively to the root one. + /// Created directory proxy. + public IDirectoryProxy CreateDirectoryProxy(string relativePath) + { + return new DirectoryProxy(this.secret, this.rootPath, relativePath); + } - /// - /// Creates a file proxy which allows to manipulate an underlying file with a specified relative path and a filename. - /// - /// The path of the underlying file relatively to the root one. - /// The filename of the underlying file. - /// Created file proxy. - public IFileProxy CreateFileProxy(string relativePath, string filename) - { - return new FileProxy(this.secret, this.rootPath, relativePath, filename); - } + /// + /// Creates a file proxy which allows to manipulate an underlying file with a specified relative path and a filename. + /// + /// The path of the underlying file relatively to the root one. + /// The filename of the underlying file. + /// Created file proxy. + public IFileProxy CreateFileProxy(string relativePath, string filename) + { + return new FileProxy(this.secret, this.rootPath, relativePath, filename); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.Dropbox/RelativeUrl.cs b/src/ExtCore.FileStorage.Dropbox/RelativeUrl.cs index 56303c1..298b9a0 100644 --- a/src/ExtCore.FileStorage.Dropbox/RelativeUrl.cs +++ b/src/ExtCore.FileStorage.Dropbox/RelativeUrl.cs @@ -4,18 +4,17 @@ using System; using System.Linq; -namespace ExtCore.FileStorage.Dropbox +namespace ExtCore.FileStorage.Dropbox; + +public static class RelativeUrl { - public static class RelativeUrl + public static string Combine(params string[] segments) { - public static string Combine(params string[] segments) - { - return "/" + string.Join( - "/", - segments.Where(s => !string.IsNullOrEmpty(s)).Select( - s => string.Join("/", s.Split(new char[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries)) - ).Where(s => !string.IsNullOrEmpty(s)) - ); - } + return "/" + string.Join( + "/", + segments.Where(s => !string.IsNullOrEmpty(s)).Select( + s => string.Join("/", s.Split(new char[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries)) + ).Where(s => !string.IsNullOrEmpty(s)) + ); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.FileSystem/AbsolutePath.cs b/src/ExtCore.FileStorage.FileSystem/AbsolutePath.cs index cab4a3b..1c27920 100644 --- a/src/ExtCore.FileStorage.FileSystem/AbsolutePath.cs +++ b/src/ExtCore.FileStorage.FileSystem/AbsolutePath.cs @@ -5,18 +5,17 @@ using System.IO; using System.Linq; -namespace ExtCore.FileStorage.FileSystem +namespace ExtCore.FileStorage.FileSystem; + +public static class AbsolutePath { - public static class AbsolutePath + public static string Combine(params string[] segments) { - public static string Combine(params string[] segments) - { - return string.Join( - Path.DirectorySeparatorChar.ToString(), - segments.Where(s => !string.IsNullOrEmpty(s)).Select( - s => string.Join(Path.DirectorySeparatorChar.ToString(), s.Split(new char[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries)) - ).Where(s => !string.IsNullOrEmpty(s)) - ); - } + return string.Join( + Path.DirectorySeparatorChar.ToString(), + segments.Where(s => !string.IsNullOrEmpty(s)).Select( + s => string.Join(Path.DirectorySeparatorChar.ToString(), s.Split(new char[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries)) + ).Where(s => !string.IsNullOrEmpty(s)) + ); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.FileSystem/DirectoryProxy.cs b/src/ExtCore.FileStorage.FileSystem/DirectoryProxy.cs index c135a8d..d7f1dce 100644 --- a/src/ExtCore.FileStorage.FileSystem/DirectoryProxy.cs +++ b/src/ExtCore.FileStorage.FileSystem/DirectoryProxy.cs @@ -8,103 +8,184 @@ using System.Threading.Tasks; using ExtCore.FileStorage.Abstractions; -namespace ExtCore.FileStorage.FileSystem +namespace ExtCore.FileStorage.FileSystem; + +/// +/// Implements the IDirectoryProxy interface and represents a directory in a file system. +/// +public class DirectoryProxy : IDirectoryProxy { + private readonly string rootPath; + private readonly string path; + + /// + /// The path of the underlying directory relatively to the root one. + /// + public string RelativePath { get; private set; } + /// - /// Implements the IDirectoryProxy interface and represents a directory in a file system. + /// Initializes a new instance of the DirectoryProxy class. /// - public class DirectoryProxy : IDirectoryProxy + /// The root path of the underlying directory's relative one. + /// The path of the underlying directory relatively to the root one. + public DirectoryProxy(string rootPath, string relativePath) { - private readonly string rootPath; - private readonly string path; - - /// - /// The path of the underlying directory relatively to the root one. - /// - public string RelativePath { get; private set; } - - /// - /// Initializes a new instance of the DirectoryProxy class. - /// - /// The root path of the underlying directory's relative one. - /// The path of the underlying directory relatively to the root one. - public DirectoryProxy(string rootPath, string relativePath) - { - this.rootPath = AbsolutePath.Combine(rootPath); - this.RelativePath = AbsolutePath.Combine(relativePath); - this.path = AbsolutePath.Combine(this.rootPath, this.RelativePath); - } - - /// - /// Checks if the underlying directory exists. - /// - /// Returns a flag indicating if the underlying directory exists. - public async Task ExistsAsync() + this.rootPath = AbsolutePath.Combine(rootPath); + this.RelativePath = AbsolutePath.Combine(relativePath); + this.path = AbsolutePath.Combine(this.rootPath, this.RelativePath); + } + + /// + /// Checks if the underlying directory exists. + /// + /// Returns a flag indicating if the underlying directory exists. + public async Task ExistsAsync() + { + return await Task.Factory.StartNew(() => Directory.Exists(this.path)); + } + + /// + /// Creates the underlying directory. + /// + /// + /// + /// + /// + public async Task CreateAsync() + { + await Task.Factory.StartNew(() => { - return await Task.Factory.StartNew(() => Directory.Exists(this.path)); - } - - /// - /// Creates the underlying directory. - /// - /// - /// - /// - /// - public async Task CreateAsync() + try + { + Directory.CreateDirectory(this.path); + } + + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.path}\". See inner exception for details.", e); + } + + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); + } + + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.path}\". See inner exception for details.", e); + } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } + }); + } + + /// + /// Moves the underlying directory. + /// + /// + /// + /// + /// + /// + /// + /// + public async Task MoveAsync(string destinationRelativePath) + { + if (destinationRelativePath == string.Empty) + throw new ArgumentException($"Value can't be empty. Parameter name: destinationRelativePath."); + + if (destinationRelativePath == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: destinationRelativePath.", default(Exception)); + + await Task.Factory.StartNew(() => { - await Task.Factory.StartNew(() => + try { - try - { - Directory.CreateDirectory(this.path); - } + Directory.Move(this.path, this.rootPath + destinationRelativePath); + } - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.path}\". See inner exception for details.", e); - } + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.path}\". See inner exception for details.", e); + } - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); - } + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); + } - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.path}\". See inner exception for details.", e); - } + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.path}\". See inner exception for details.", e); + } - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } - }); - } - - /// - /// Moves the underlying directory. - /// - /// - /// - /// - /// - /// - /// - /// - public async Task MoveAsync(string destinationRelativePath) + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } + }); + } + + /// + /// Deletes the underlying directory. + /// + /// Pass true to remove all the underlying directory content recursively; otherwise false. + /// + /// + /// + /// + public async Task DeleteAsync(bool recursive) + { + await Task.Factory.StartNew(() => { - if (destinationRelativePath == string.Empty) - throw new ArgumentException($"Value can't be empty. Parameter name: destinationRelativePath."); + try + { + Directory.Delete(this.path, recursive); + } + + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.path}\". See inner exception for details.", e); + } - if (destinationRelativePath == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: destinationRelativePath.", default(Exception)); + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); + } + + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.path}\". See inner exception for details.", e); + } - await Task.Factory.StartNew(() => + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); + } + }); + } + + /// + /// Gets the directory proxies for the directories inside the underlying one. + /// + /// The directory proxies for the directories inside the underlying one + /// + /// + /// + /// + public async Task> GetDirectoryProxiesAsync() + { + return await Task>.Factory.StartNew( + () => { try { - Directory.Move(this.path, this.rootPath + destinationRelativePath); + return Directory.GetDirectories(this.path).Select( + d => new DirectoryProxy(this.rootPath, d.Substring(this.rootPath.Length)) + ); } catch (UnauthorizedAccessException e) @@ -126,24 +207,35 @@ await Task.Factory.StartNew(() => { throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); } - }); - } - - /// - /// Deletes the underlying directory. - /// - /// Pass true to remove all the underlying directory content recursively; otherwise false. - /// - /// - /// - /// - public async Task DeleteAsync(bool recursive) - { - await Task.Factory.StartNew(() => + } + ); + } + + /// + /// Gets the file proxies for the files inside the underlying one. + /// + /// The file proxies for the files inside the underlying directory. + /// + /// + /// + /// + public async Task> GetFileProxiesAsync() + { + return await Task>.Factory.StartNew( + () => { try { - Directory.Delete(this.path, recursive); + return Directory.GetFiles(this.path).Select( + f => + { + string relativePath = f; + + relativePath = relativePath.Substring(this.rootPath.Length); + relativePath = relativePath.Remove(relativePath.LastIndexOf(Path.DirectorySeparatorChar)); + return new FileProxy(this.rootPath, relativePath, f.Substring(f.LastIndexOf(Path.DirectorySeparatorChar) + 1)); + } + ); } catch (UnauthorizedAccessException e) @@ -165,100 +257,7 @@ await Task.Factory.StartNew(() => { throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); } - }); - } - - /// - /// Gets the directory proxies for the directories inside the underlying one. - /// - /// The directory proxies for the directories inside the underlying one - /// - /// - /// - /// - public async Task> GetDirectoryProxiesAsync() - { - return await Task>.Factory.StartNew( - () => - { - try - { - return Directory.GetDirectories(this.path).Select( - d => new DirectoryProxy(this.rootPath, d.Substring(this.rootPath.Length)) - ); - } - - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.path}\". See inner exception for details.", e); - } - - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); - } - - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.path}\". See inner exception for details.", e); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } - } - ); - } - - /// - /// Gets the file proxies for the files inside the underlying one. - /// - /// The file proxies for the files inside the underlying directory. - /// - /// - /// - /// - public async Task> GetFileProxiesAsync() - { - return await Task>.Factory.StartNew( - () => - { - try - { - return Directory.GetFiles(this.path).Select( - f => - { - string relativePath = f; - - relativePath = relativePath.Substring(this.rootPath.Length); - relativePath = relativePath.Remove(relativePath.LastIndexOf(Path.DirectorySeparatorChar)); - return new FileProxy(this.rootPath, relativePath, f.Substring(f.LastIndexOf(Path.DirectorySeparatorChar) + 1)); - } - ); - } - - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.path}\". See inner exception for details.", e); - } - - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.path}\". See inner exception for details.", e); - } - - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.path}\". See inner exception for details.", e); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.path}\". See inner exception for details.", e); - } - } - ); - } + } + ); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.FileSystem/FileProxy.cs b/src/ExtCore.FileStorage.FileSystem/FileProxy.cs index e86ac18..1a44a5d 100644 --- a/src/ExtCore.FileStorage.FileSystem/FileProxy.cs +++ b/src/ExtCore.FileStorage.FileSystem/FileProxy.cs @@ -7,382 +7,381 @@ using System.Threading.Tasks; using ExtCore.FileStorage.Abstractions; -namespace ExtCore.FileStorage.FileSystem +namespace ExtCore.FileStorage.FileSystem; + +/// +/// Implements the IDirectoryProxy interface and represents a file in a file system. +/// +public class FileProxy : IFileProxy { + private readonly string rootPath; + private readonly string filepath; + + /// + /// The path of the underlying file relatively to the root one. + /// + public string RelativePath { get; private set; } + /// - /// Implements the IDirectoryProxy interface and represents a file in a file system. + /// The filename of the underlying file. /// - public class FileProxy : IFileProxy + public string Filename { get; private set; } + + /// + /// Initializes a new instance of the FileProxy class. + /// + /// The root path of the underlying file's relative one. + /// The path of the underlying file relatively to the root one. + /// The filename of the underlying file. + /// + /// + public FileProxy(string rootPath, string relativePath, string filename) { - private readonly string rootPath; - private readonly string filepath; - - /// - /// The path of the underlying file relatively to the root one. - /// - public string RelativePath { get; private set; } - - /// - /// The filename of the underlying file. - /// - public string Filename { get; private set; } - - /// - /// Initializes a new instance of the FileProxy class. - /// - /// The root path of the underlying file's relative one. - /// The path of the underlying file relatively to the root one. - /// The filename of the underlying file. - /// - /// - public FileProxy(string rootPath, string relativePath, string filename) - { - if (filename == string.Empty) - throw new ArgumentException($"Value can't be empty. Parameter name: filename."); - - if (filename == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: filename.", default(Exception)); - - this.rootPath = rootPath; - this.RelativePath = relativePath; - this.Filename = filename; - this.filepath = AbsolutePath.Combine(this.rootPath, this.RelativePath, this.Filename); - } - - /// - /// Checks if the underlying file exists. - /// - /// Returns a flag indicating if the underlying file exists. - public async Task ExistsAsync() - { - return await Task.Factory.StartNew(() => File.Exists(this.filepath)); - } - - /// - /// Reads content of the underlying file as a stream. - /// - /// Content of the underlying file as a stream. - /// - /// - /// - /// - /// - public async Task ReadStreamAsync() + if (filename == string.Empty) + throw new ArgumentException($"Value can't be empty. Parameter name: filename."); + + if (filename == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: filename.", default(Exception)); + + this.rootPath = rootPath; + this.RelativePath = relativePath; + this.Filename = filename; + this.filepath = AbsolutePath.Combine(this.rootPath, this.RelativePath, this.Filename); + } + + /// + /// Checks if the underlying file exists. + /// + /// Returns a flag indicating if the underlying file exists. + public async Task ExistsAsync() + { + return await Task.Factory.StartNew(() => File.Exists(this.filepath)); + } + + /// + /// Reads content of the underlying file as a stream. + /// + /// Content of the underlying file as a stream. + /// + /// + /// + /// + /// + public async Task ReadStreamAsync() + { + return await Task.Factory.StartNew(() => { - return await Task.Factory.StartNew(() => - { - try - { - return File.Open(this.filepath, FileMode.Open); - } - - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.FileNotFoundException e) - { - throw new FileNotFoundException($"File not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } - }); - } - - /// - /// Reads content of the underlying file as a byte array. - /// - /// Content of the underlying file as a byte array. - /// - /// - /// - /// - /// - public async Task ReadBytesAsync() + try + { + return File.Open(this.filepath, FileMode.Open); + } + + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.FileNotFoundException e) + { + throw new FileNotFoundException($"File not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } + }); + } + + /// + /// Reads content of the underlying file as a byte array. + /// + /// Content of the underlying file as a byte array. + /// + /// + /// + /// + /// + public async Task ReadBytesAsync() + { + return await Task.Factory.StartNew(() => { - return await Task.Factory.StartNew(() => - { - try - { - return File.ReadAllBytes(this.filepath); - } - - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (SecurityException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.FileNotFoundException e) - { - throw new FileNotFoundException($"File not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } - }); - } - - /// - /// Reads content of the underlying file as a text string. - /// - /// Content of the underlying file as a text string. - /// - /// - /// - /// - /// - public async Task ReadTextAsync() + try + { + return File.ReadAllBytes(this.filepath); + } + + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (SecurityException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.FileNotFoundException e) + { + throw new FileNotFoundException($"File not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } + }); + } + + /// + /// Reads content of the underlying file as a text string. + /// + /// Content of the underlying file as a text string. + /// + /// + /// + /// + /// + public async Task ReadTextAsync() + { + return await Task.Factory.StartNew(() => { - return await Task.Factory.StartNew(() => - { - try - { - return File.ReadAllText(this.filepath); - } - - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (SecurityException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.FileNotFoundException e) - { - throw new FileNotFoundException($"File not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } - }); - } - - /// - /// Writes content to the underlying file as a stream. - /// - /// Content to write to the underlying file as a stream. - /// - /// - /// - /// - /// - public async Task WriteStreamAsync(Stream inputStream) + try + { + return File.ReadAllText(this.filepath); + } + + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (SecurityException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.FileNotFoundException e) + { + throw new FileNotFoundException($"File not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } + }); + } + + /// + /// Writes content to the underlying file as a stream. + /// + /// Content to write to the underlying file as a stream. + /// + /// + /// + /// + /// + public async Task WriteStreamAsync(Stream inputStream) + { + if (inputStream == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: inputStream.", default(Exception)); + + await Task.Factory.StartNew(() => { - if (inputStream == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: inputStream.", default(Exception)); - - await Task.Factory.StartNew(() => - { - try - { - using (Stream outputStream = File.Create(this.filepath)) - inputStream.CopyTo(outputStream); - } - - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } - }); - } - - /// - /// Writes content to the underlying file as a byte array. - /// - /// Content to write to the underlying file as a byte array. - /// - /// - /// - /// - /// - public async Task WriteBytesAsync(byte[] bytes) + try + { + using (Stream outputStream = File.Create(this.filepath)) + inputStream.CopyTo(outputStream); + } + + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } + }); + } + + /// + /// Writes content to the underlying file as a byte array. + /// + /// Content to write to the underlying file as a byte array. + /// + /// + /// + /// + /// + public async Task WriteBytesAsync(byte[] bytes) + { + if (bytes == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: bytes.", default(Exception)); + + await Task.Factory.StartNew(() => { - if (bytes == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: bytes.", default(Exception)); - - await Task.Factory.StartNew(() => - { - try - { - File.WriteAllBytes(this.filepath, bytes); - } - - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (SecurityException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } - }); - } - - /// - /// Writes content to the underlying file as a text string. - /// - /// Content to write to the underlying file as a text string. - /// - /// - /// - /// - /// - public async Task WriteTextAsync(string text) + try + { + File.WriteAllBytes(this.filepath, bytes); + } + + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (SecurityException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } + }); + } + + /// + /// Writes content to the underlying file as a text string. + /// + /// Content to write to the underlying file as a text string. + /// + /// + /// + /// + /// + public async Task WriteTextAsync(string text) + { + if (text == null) + throw new ArgumentNullException($"Value can't be null. Parameter name: text.", default(Exception)); + + await Task.Factory.StartNew(() => { - if (text == null) - throw new ArgumentNullException($"Value can't be null. Parameter name: text.", default(Exception)); - - await Task.Factory.StartNew(() => - { - try - { - File.WriteAllText(this.filepath, text); - } - - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (SecurityException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } - }); - } - - /// - /// Deletes the underlying file. - /// - /// - /// - /// - /// - /// - public async Task DeleteAsync() + try + { + File.WriteAllText(this.filepath, text); + } + + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (SecurityException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } + }); + } + + /// + /// Deletes the underlying file. + /// + /// + /// + /// + /// + /// + public async Task DeleteAsync() + { + await Task.Factory.StartNew(() => { - await Task.Factory.StartNew(() => - { - if (!File.Exists(this.filepath)) - throw new FileNotFoundException($"File not found: \"{this.filepath}\".", null); - - try - { - File.Delete(this.filepath); - } - - catch (UnauthorizedAccessException e) - { - throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.DirectoryNotFoundException e) - { - throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (System.IO.PathTooLongException e) - { - throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); - } - - catch (Exception e) - { - throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); - } - }); - } + if (!File.Exists(this.filepath)) + throw new FileNotFoundException($"File not found: \"{this.filepath}\".", null); + + try + { + File.Delete(this.filepath); + } + + catch (UnauthorizedAccessException e) + { + throw new AccessDeniedException($"Access denied: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.DirectoryNotFoundException e) + { + throw new DirectoryNotFoundException($"Directory not found: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (System.IO.PathTooLongException e) + { + throw new PathTooLongException($"Path too long: \"{this.filepath}\". See inner exception for details.", e); + } + + catch (Exception e) + { + throw new FileStorageException($"Generic file storage exception: \"{this.filepath}\". See inner exception for details.", e); + } + }); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage.FileSystem/FileStorage.cs b/src/ExtCore.FileStorage.FileSystem/FileStorage.cs index 72692f4..2d308f6 100644 --- a/src/ExtCore.FileStorage.FileSystem/FileStorage.cs +++ b/src/ExtCore.FileStorage.FileSystem/FileStorage.cs @@ -4,43 +4,42 @@ using ExtCore.FileStorage.Abstractions; using Microsoft.Extensions.Options; -namespace ExtCore.FileStorage.FileSystem +namespace ExtCore.FileStorage.FileSystem; + +/// +/// Implements the IFileStorage interface and represents a file storage in a file system. +/// +public class FileStorage : IFileStorage { + private readonly string rootPath; + /// - /// Implements the IFileStorage interface and represents a file storage in a file system. + /// Initializes a new instance of the FileStorage class. /// - public class FileStorage : IFileStorage + /// The options that are used to configure the file storage root path. + public FileStorage(IOptions options) { - private readonly string rootPath; - - /// - /// Initializes a new instance of the FileStorage class. - /// - /// The options that are used to configure the file storage root path. - public FileStorage(IOptions options) - { - this.rootPath = options.Value.RootPath; - } + this.rootPath = options.Value.RootPath; + } - /// - /// Creates a directory proxy which allows to manipulate an underlying directory with a specified relative path. - /// - /// The path of the underlying directory relatively to the root one. - /// Created directory proxy. - public IDirectoryProxy CreateDirectoryProxy(string relativePath) - { - return new DirectoryProxy(this.rootPath, relativePath); - } + /// + /// Creates a directory proxy which allows to manipulate an underlying directory with a specified relative path. + /// + /// The path of the underlying directory relatively to the root one. + /// Created directory proxy. + public IDirectoryProxy CreateDirectoryProxy(string relativePath) + { + return new DirectoryProxy(this.rootPath, relativePath); + } - /// - /// Creates a file proxy which allows to manipulate an underlying file with a specified relative path and a filename. - /// - /// The path of the underlying file relatively to the root one. - /// The filename of the underlying file. - /// Created file proxy. - public IFileProxy CreateFileProxy(string relativePath, string filename) - { - return new FileProxy(this.rootPath, relativePath, filename); - } + /// + /// Creates a file proxy which allows to manipulate an underlying file with a specified relative path and a filename. + /// + /// The path of the underlying file relatively to the root one. + /// The filename of the underlying file. + /// Created file proxy. + public IFileProxy CreateFileProxy(string relativePath, string filename) + { + return new FileProxy(this.rootPath, relativePath, filename); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage/Actions/AddFileStorageAction.cs b/src/ExtCore.FileStorage/Actions/AddFileStorageAction.cs index b1a9a52..2debc52 100644 --- a/src/ExtCore.FileStorage/Actions/AddFileStorageAction.cs +++ b/src/ExtCore.FileStorage/Actions/AddFileStorageAction.cs @@ -10,41 +10,40 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -namespace ExtCore.FileStorage.Actions +namespace ExtCore.FileStorage.Actions; + +/// +/// Implements the IConfigureServicesAction interface and +/// registers found implementation of the IFileStorage interface inside the DI. +/// +public class AddFileStorageAction : IConfigureServicesAction { /// - /// Implements the IConfigureServicesAction interface and - /// registers found implementation of the IFileStorage interface inside the DI. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). + /// + public int Priority => 1000; + + /// + /// Registers found implementation of the IFileStorage interface inside the DI. /// - public class AddFileStorageAction : IConfigureServicesAction + /// + /// Will be provided by the ExtCore and might be used to register any service inside the DI. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + public void Execute(IServiceCollection services, IServiceProvider serviceProvider) { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - public int Priority => 1000; + Type type = ExtensionManager.GetImplementations()?.FirstOrDefault(t => !t.GetTypeInfo().IsAbstract); - /// - /// Registers found implementation of the IFileStorage interface inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to register any service inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - public void Execute(IServiceCollection services, IServiceProvider serviceProvider) + if (type == null) { - Type type = ExtensionManager.GetImplementations()?.FirstOrDefault(t => !t.GetTypeInfo().IsAbstract); + ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.FileStorage"); - if (type == null) - { - ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.FileStorage"); - - logger.LogError("Implementation of ExtCore.FileStorage.Abstractions.IFileStorage not found"); - return; - } - - services.AddScoped(typeof(IFileStorage), type); + logger.LogError("Implementation of ExtCore.FileStorage.Abstractions.IFileStorage not found"); + return; } + + services.AddScoped(typeof(IFileStorage), type); } } \ No newline at end of file diff --git a/src/ExtCore.FileStorage/Extension.cs b/src/ExtCore.FileStorage/Extension.cs index fc89843..291ed1d 100644 --- a/src/ExtCore.FileStorage/Extension.cs +++ b/src/ExtCore.FileStorage/Extension.cs @@ -3,31 +3,30 @@ using ExtCore.Infrastructure; -namespace ExtCore.FileStorage +namespace ExtCore.FileStorage; + +/// +/// Overrides the ExtensionBase class and provides the ExtCore.FileStorage extension information. +/// +public class Extension : ExtensionBase { /// - /// Overrides the ExtensionBase class and provides the ExtCore.FileStorage extension information. + /// Gets the name of the extension. /// - public class Extension : ExtensionBase - { - /// - /// Gets the name of the extension. - /// - public override string Name => "ExtCore.FileStorage"; + public override string Name => "ExtCore.FileStorage"; - /// - /// Gets the URL of the extension. - /// - public override string Url => "https://extcore.net/"; + /// + /// Gets the URL of the extension. + /// + public override string Url => "https://extcore.net/"; - /// - /// Gets the version of the extension. - /// - public override string Version => "8.1.0"; + /// + /// Gets the version of the extension. + /// + public override string Version => "8.1.0"; - /// - /// Gets the authors of the extension (separated by commas). - /// - public override string Authors => "Dmitry Sikorsky"; - } + /// + /// Gets the authors of the extension (separated by commas). + /// + public override string Authors => "Dmitry Sikorsky"; } \ No newline at end of file diff --git a/src/ExtCore.Infrastructure/Actions/IConfigureAction.cs b/src/ExtCore.Infrastructure/Actions/IConfigureAction.cs index bf85e9d..7820511 100644 --- a/src/ExtCore.Infrastructure/Actions/IConfigureAction.cs +++ b/src/ExtCore.Infrastructure/Actions/IConfigureAction.cs @@ -4,28 +4,27 @@ using System; using Microsoft.AspNetCore.Builder; -namespace ExtCore.Infrastructure.Actions +namespace ExtCore.Infrastructure.Actions; + +/// +/// Describes an action that must be executed inside the Configure method of a web application's Startup class +/// and might be used by the extensions to configure a web application's request pipeline. +/// +public interface IConfigureAction { /// - /// Describes an action that must be executed inside the Configure method of a web application's Startup class - /// and might be used by the extensions to configure a web application's request pipeline. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). /// - public interface IConfigureAction - { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - int Priority { get; } + int Priority { get; } - /// - /// Contains any code that must be executed inside the Configure method of the web application's Startup class. - /// - /// - /// Will be provided by the ExtCore and might be used to configure a web application's request pipeline. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - void Execute(IApplicationBuilder applicationBuilder, IServiceProvider serviceProvider); - } + /// + /// Contains any code that must be executed inside the Configure method of the web application's Startup class. + /// + /// + /// Will be provided by the ExtCore and might be used to configure a web application's request pipeline. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + void Execute(IApplicationBuilder applicationBuilder, IServiceProvider serviceProvider); } \ No newline at end of file diff --git a/src/ExtCore.Infrastructure/Actions/IConfigureServicesAction.cs b/src/ExtCore.Infrastructure/Actions/IConfigureServicesAction.cs index 4b344f2..e202d9c 100644 --- a/src/ExtCore.Infrastructure/Actions/IConfigureServicesAction.cs +++ b/src/ExtCore.Infrastructure/Actions/IConfigureServicesAction.cs @@ -4,28 +4,27 @@ using System; using Microsoft.Extensions.DependencyInjection; -namespace ExtCore.Infrastructure.Actions +namespace ExtCore.Infrastructure.Actions; + +/// +/// Describes an action that must be executed inside the ConfigureServices method of a web application's Startup class +/// and might be used by the extensions to register any service inside the DI. +/// +public interface IConfigureServicesAction { /// - /// Describes an action that must be executed inside the ConfigureServices method of a web application's Startup class - /// and might be used by the extensions to register any service inside the DI. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). /// - public interface IConfigureServicesAction - { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - int Priority { get; } + int Priority { get; } - /// - /// Contains any code that must be executed inside the ConfigureServices method of the web application's Startup class. - /// - /// - /// Will be provided by the ExtCore and might be used to register any service inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - void Execute(IServiceCollection services, IServiceProvider serviceProvider); - } + /// + /// Contains any code that must be executed inside the ConfigureServices method of the web application's Startup class. + /// + /// + /// Will be provided by the ExtCore and might be used to register any service inside the DI. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + void Execute(IServiceCollection services, IServiceProvider serviceProvider); } \ No newline at end of file diff --git a/src/ExtCore.Infrastructure/ExtensionBase.cs b/src/ExtCore.Infrastructure/ExtensionBase.cs index 4b92b94..d33dd08 100644 --- a/src/ExtCore.Infrastructure/ExtensionBase.cs +++ b/src/ExtCore.Infrastructure/ExtensionBase.cs @@ -1,36 +1,35 @@ // Copyright © 2017 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.Infrastructure +namespace ExtCore.Infrastructure; + +/// +/// Implements the IExtension interface and represents default extension behavior. +/// +public abstract class ExtensionBase : IExtension { /// - /// Implements the IExtension interface and represents default extension behavior. + /// Gets the name of the extension. /// - public abstract class ExtensionBase : IExtension - { - /// - /// Gets the name of the extension. - /// - public virtual string Name => this.GetType().FullName; + public virtual string Name => this.GetType().FullName; - /// - /// Gets the description of the extension. - /// - public virtual string Description => null; + /// + /// Gets the description of the extension. + /// + public virtual string Description => null; - /// - /// Gets the URL of the extension. - /// - public virtual string Url => null; + /// + /// Gets the URL of the extension. + /// + public virtual string Url => null; - /// - /// Gets the version of the extension. - /// - public virtual string Version => null; + /// + /// Gets the version of the extension. + /// + public virtual string Version => null; - /// - /// Gets the authors of the extension (separated by commas). - /// - public virtual string Authors => null; - } + /// + /// Gets the authors of the extension (separated by commas). + /// + public virtual string Authors => null; } \ No newline at end of file diff --git a/src/ExtCore.Infrastructure/ExtensionManager.cs b/src/ExtCore.Infrastructure/ExtensionManager.cs index 9b48ab6..aef30e3 100644 --- a/src/ExtCore.Infrastructure/ExtensionManager.cs +++ b/src/ExtCore.Infrastructure/ExtensionManager.cs @@ -7,262 +7,261 @@ using System.Linq; using System.Reflection; -namespace ExtCore.Infrastructure +namespace ExtCore.Infrastructure; + +/// +/// Represents the assembly cache with the mechanism of getting implementations or instances of a given type. +/// This is the global access point to the ExtCore type discovering mechanism. +/// +public static class ExtensionManager { + private static IEnumerable assemblies; + private static ConcurrentDictionary> types; + /// - /// Represents the assembly cache with the mechanism of getting implementations or instances of a given type. - /// This is the global access point to the ExtCore type discovering mechanism. + /// Gets the cached assemblies that have been set by the SetAssemblies method. /// - public static class ExtensionManager + public static IEnumerable Assemblies { - private static IEnumerable assemblies; - private static ConcurrentDictionary> types; - - /// - /// Gets the cached assemblies that have been set by the SetAssemblies method. - /// - public static IEnumerable Assemblies + get { - get - { - return ExtensionManager.assemblies; - } + return ExtensionManager.assemblies; } + } - /// - /// Sets the assemblies and invalidates the type cache. - /// - /// The assemblies to set. - public static void SetAssemblies(IEnumerable assemblies) - { - ExtensionManager.assemblies = assemblies; - ExtensionManager.types = new ConcurrentDictionary>(); - } + /// + /// Sets the assemblies and invalidates the type cache. + /// + /// The assemblies to set. + public static void SetAssemblies(IEnumerable assemblies) + { + ExtensionManager.assemblies = assemblies; + ExtensionManager.types = new ConcurrentDictionary>(); + } - /// - /// Gets the first implementation of the type specified by the type parameter, or null if no implementations found. - /// - /// The type parameter to find implementation of. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the same type(s) is requested. - /// - /// The first found implementation of the given type. - public static Type GetImplementation(bool useCaching = false) - { - return ExtensionManager.GetImplementation(null, useCaching); - } + /// + /// Gets the first implementation of the type specified by the type parameter, or null if no implementations found. + /// + /// The type parameter to find implementation of. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the same type(s) is requested. + /// + /// The first found implementation of the given type. + public static Type GetImplementation(bool useCaching = false) + { + return ExtensionManager.GetImplementation(null, useCaching); + } - /// - /// Gets the first implementation of the type specified by the type parameter and located in the assemblies - /// filtered by the predicate, or null if no implementations found. - /// - /// The type parameter to find implementation of. - /// The predicate to filter the assemblies. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the same type(s) is requested. - /// - /// The first found implementation of the given type. - public static Type GetImplementation(Func predicate, bool useCaching = false) - { - return ExtensionManager.GetImplementations(predicate, useCaching).FirstOrDefault(); - } + /// + /// Gets the first implementation of the type specified by the type parameter and located in the assemblies + /// filtered by the predicate, or null if no implementations found. + /// + /// The type parameter to find implementation of. + /// The predicate to filter the assemblies. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the same type(s) is requested. + /// + /// The first found implementation of the given type. + public static Type GetImplementation(Func predicate, bool useCaching = false) + { + return ExtensionManager.GetImplementations(predicate, useCaching).FirstOrDefault(); + } - /// - /// Gets the implementations of the type specified by the type parameter. - /// - /// The type parameter to find implementations of. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the same type(s) is requested. - /// - /// Found implementations of the given type. - public static IEnumerable GetImplementations(bool useCaching = false) - { - return ExtensionManager.GetImplementations(null, useCaching); - } + /// + /// Gets the implementations of the type specified by the type parameter. + /// + /// The type parameter to find implementations of. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the same type(s) is requested. + /// + /// Found implementations of the given type. + public static IEnumerable GetImplementations(bool useCaching = false) + { + return ExtensionManager.GetImplementations(null, useCaching); + } - /// - /// Gets the implementations of the type specified by the type parameter and located in the assemblies - /// filtered by the predicate. - /// - /// The type parameter to find implementations of. - /// The predicate to filter the assemblies. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the same type(s) is requested. - /// - /// Found implementations of the given type. - public static IEnumerable GetImplementations(Func predicate, bool useCaching = false) - { - Type type = typeof(T); + /// + /// Gets the implementations of the type specified by the type parameter and located in the assemblies + /// filtered by the predicate. + /// + /// The type parameter to find implementations of. + /// The predicate to filter the assemblies. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the same type(s) is requested. + /// + /// Found implementations of the given type. + public static IEnumerable GetImplementations(Func predicate, bool useCaching = false) + { + Type type = typeof(T); - if (useCaching && ExtensionManager.types.ContainsKey(type)) - return ExtensionManager.types[type]; + if (useCaching && ExtensionManager.types.ContainsKey(type)) + return ExtensionManager.types[type]; - List implementations = new List(); + List implementations = new List(); - foreach (Assembly assembly in ExtensionManager.GetAssemblies(predicate)) - foreach (Type exportedType in assembly.GetExportedTypes()) - if (type.GetTypeInfo().IsAssignableFrom(exportedType) && exportedType.GetTypeInfo().IsClass) - implementations.Add(exportedType); + foreach (Assembly assembly in ExtensionManager.GetAssemblies(predicate)) + foreach (Type exportedType in assembly.GetExportedTypes()) + if (type.GetTypeInfo().IsAssignableFrom(exportedType) && exportedType.GetTypeInfo().IsClass) + implementations.Add(exportedType); - if (useCaching) - ExtensionManager.types[type] = implementations; + if (useCaching) + ExtensionManager.types[type] = implementations; - return implementations; - } + return implementations; + } - /// - /// Gets the new instance of the first implementation of the type specified by the type parameter, - /// or null if no implementations found. - /// - /// The type parameter to find implementation of. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the instance(s) of the same type(s) is requested. - /// - /// The instance of the first found implementation of the given type. - public static T GetInstance(bool useCaching = false) - { - return ExtensionManager.GetInstance(null, useCaching, new object[] { }); - } + /// + /// Gets the new instance of the first implementation of the type specified by the type parameter, + /// or null if no implementations found. + /// + /// The type parameter to find implementation of. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the instance(s) of the same type(s) is requested. + /// + /// The instance of the first found implementation of the given type. + public static T GetInstance(bool useCaching = false) + { + return ExtensionManager.GetInstance(null, useCaching, new object[] { }); + } - /// - /// Gets the new instance (using constructor that matches the arguments) of the first implementation - /// of the type specified by the type parameter or null if no implementations found. - /// - /// The type parameter to find implementation of. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the instance(s) of the same type(s) is requested. - /// - /// The arguments to be passed to the constructor. - /// The instance of the first found implementation of the given type. - public static T GetInstance(bool useCaching = false, params object[] args) - { - return ExtensionManager.GetInstance(null, useCaching, args); - } + /// + /// Gets the new instance (using constructor that matches the arguments) of the first implementation + /// of the type specified by the type parameter or null if no implementations found. + /// + /// The type parameter to find implementation of. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the instance(s) of the same type(s) is requested. + /// + /// The arguments to be passed to the constructor. + /// The instance of the first found implementation of the given type. + public static T GetInstance(bool useCaching = false, params object[] args) + { + return ExtensionManager.GetInstance(null, useCaching, args); + } - /// - /// Gets the new instance of the first implementation of the type specified by the type parameter - /// and located in the assemblies filtered by the predicate or null if no implementations found. - /// - /// The type parameter to find implementation of. - /// The predicate to filter the assemblies. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the instance(s) of the same type(s) is requested. - /// - /// The instance of the first found implementation of the given type. - public static T GetInstance(Func predicate, bool useCaching = false) - { - return ExtensionManager.GetInstances(predicate, useCaching).FirstOrDefault(); - } + /// + /// Gets the new instance of the first implementation of the type specified by the type parameter + /// and located in the assemblies filtered by the predicate or null if no implementations found. + /// + /// The type parameter to find implementation of. + /// The predicate to filter the assemblies. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the instance(s) of the same type(s) is requested. + /// + /// The instance of the first found implementation of the given type. + public static T GetInstance(Func predicate, bool useCaching = false) + { + return ExtensionManager.GetInstances(predicate, useCaching).FirstOrDefault(); + } - /// - /// Gets the new instance (using constructor that matches the arguments) of the first implementation - /// of the type specified by the type parameter and located in the assemblies filtered by the predicate - /// or null if no implementations found. - /// - /// The type parameter to find implementation of. - /// The predicate to filter the assemblies. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the instance(s) of the same type(s) is requested. - /// - /// The arguments to be passed to the constructor. - /// The instance of the first found implementation of the given type. - public static T GetInstance(Func predicate, bool useCaching = false, params object[] args) - { - return ExtensionManager.GetInstances(predicate, useCaching, args).FirstOrDefault(); - } + /// + /// Gets the new instance (using constructor that matches the arguments) of the first implementation + /// of the type specified by the type parameter and located in the assemblies filtered by the predicate + /// or null if no implementations found. + /// + /// The type parameter to find implementation of. + /// The predicate to filter the assemblies. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the instance(s) of the same type(s) is requested. + /// + /// The arguments to be passed to the constructor. + /// The instance of the first found implementation of the given type. + public static T GetInstance(Func predicate, bool useCaching = false, params object[] args) + { + return ExtensionManager.GetInstances(predicate, useCaching, args).FirstOrDefault(); + } - /// - /// Gets the new instances of the implementations of the type specified by the type parameter - /// or empty enumeration if no implementations found. - /// - /// The type parameter to find implementations of. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the instance(s) of the same type(s) is requested. - /// - /// The instances of the found implementations of the given type. - public static IEnumerable GetInstances(bool useCaching = false) - { - return ExtensionManager.GetInstances(null, useCaching, new object[] { }); - } + /// + /// Gets the new instances of the implementations of the type specified by the type parameter + /// or empty enumeration if no implementations found. + /// + /// The type parameter to find implementations of. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the instance(s) of the same type(s) is requested. + /// + /// The instances of the found implementations of the given type. + public static IEnumerable GetInstances(bool useCaching = false) + { + return ExtensionManager.GetInstances(null, useCaching, new object[] { }); + } - /// - /// Gets the new instances (using constructor that matches the arguments) of the implementations - /// of the type specified by the type parameter or empty enumeration if no implementations found. - /// - /// The type parameter to find implementations of. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the instance(s) of the same type(s) is requested. - /// - /// The arguments to be passed to the constructors. - /// The instances of the found implementations of the given type. - public static IEnumerable GetInstances(bool useCaching = false, params object[] args) - { - return ExtensionManager.GetInstances(null, useCaching, args); - } + /// + /// Gets the new instances (using constructor that matches the arguments) of the implementations + /// of the type specified by the type parameter or empty enumeration if no implementations found. + /// + /// The type parameter to find implementations of. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the instance(s) of the same type(s) is requested. + /// + /// The arguments to be passed to the constructors. + /// The instances of the found implementations of the given type. + public static IEnumerable GetInstances(bool useCaching = false, params object[] args) + { + return ExtensionManager.GetInstances(null, useCaching, args); + } - /// - /// Gets the new instances of the implementations of the type specified by the type parameter - /// and located in the assemblies filtered by the predicate or empty enumeration - /// if no implementations found. - /// - /// The type parameter to find implementations of. - /// The predicate to filter the assemblies. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the instance(s) of the same type(s) is requested. - /// - /// The instances of the found implementations of the given type. - public static IEnumerable GetInstances(Func predicate, bool useCaching = false) - { - return ExtensionManager.GetInstances(predicate, useCaching, new object[] { }); - } + /// + /// Gets the new instances of the implementations of the type specified by the type parameter + /// and located in the assemblies filtered by the predicate or empty enumeration + /// if no implementations found. + /// + /// The type parameter to find implementations of. + /// The predicate to filter the assemblies. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the instance(s) of the same type(s) is requested. + /// + /// The instances of the found implementations of the given type. + public static IEnumerable GetInstances(Func predicate, bool useCaching = false) + { + return ExtensionManager.GetInstances(predicate, useCaching, new object[] { }); + } - /// - /// Gets the new instances (using constructor that matches the arguments) of the implementations - /// of the type specified by the type parameter and located in the assemblies filtered by the predicate - /// or empty enumeration if no implementations found. - /// - /// The type parameter to find implementations of. - /// The predicate to filter the assemblies. - /// - /// Determines whether the type cache should be used to avoid assemblies scanning next time, - /// when the instance(s) of the same type(s) is requested. - /// - /// The arguments to be passed to the constructors. - /// The instances of the found implementations of the given type. - public static IEnumerable GetInstances(Func predicate, bool useCaching = false, params object[] args) - { - List instances = new List(); + /// + /// Gets the new instances (using constructor that matches the arguments) of the implementations + /// of the type specified by the type parameter and located in the assemblies filtered by the predicate + /// or empty enumeration if no implementations found. + /// + /// The type parameter to find implementations of. + /// The predicate to filter the assemblies. + /// + /// Determines whether the type cache should be used to avoid assemblies scanning next time, + /// when the instance(s) of the same type(s) is requested. + /// + /// The arguments to be passed to the constructors. + /// The instances of the found implementations of the given type. + public static IEnumerable GetInstances(Func predicate, bool useCaching = false, params object[] args) + { + List instances = new List(); - foreach (Type implementation in ExtensionManager.GetImplementations(predicate, useCaching)) + foreach (Type implementation in ExtensionManager.GetImplementations(predicate, useCaching)) + { + if (!implementation.GetTypeInfo().IsAbstract) { - if (!implementation.GetTypeInfo().IsAbstract) - { - T instance = (T)Activator.CreateInstance(implementation, args); + T instance = (T)Activator.CreateInstance(implementation, args); - instances.Add(instance); - } + instances.Add(instance); } - - return instances; } - private static IEnumerable GetAssemblies(Func predicate) - { - if (predicate == null) - return ExtensionManager.Assemblies; + return instances; + } - return ExtensionManager.Assemblies.Where(predicate); - } + private static IEnumerable GetAssemblies(Func predicate) + { + if (predicate == null) + return ExtensionManager.Assemblies; + + return ExtensionManager.Assemblies.Where(predicate); } } \ No newline at end of file diff --git a/src/ExtCore.Infrastructure/IExtension.cs b/src/ExtCore.Infrastructure/IExtension.cs index 96d6bc8..a4b0693 100644 --- a/src/ExtCore.Infrastructure/IExtension.cs +++ b/src/ExtCore.Infrastructure/IExtension.cs @@ -1,36 +1,35 @@ // Copyright © 2017 Dmitry Sikorsky. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace ExtCore.Infrastructure +namespace ExtCore.Infrastructure; + +/// +/// Describes an extension. +/// +public interface IExtension { /// - /// Describes an extension. + /// Gets the name of the extension. /// - public interface IExtension - { - /// - /// Gets the name of the extension. - /// - string Name { get; } + string Name { get; } - /// - /// Gets the description of the extension. - /// - string Description { get; } + /// + /// Gets the description of the extension. + /// + string Description { get; } - /// - /// Gets the URL of the extension. - /// - string Url { get; } + /// + /// Gets the URL of the extension. + /// + string Url { get; } - /// - /// Gets the version of the extension. - /// - string Version { get; } + /// + /// Gets the version of the extension. + /// + string Version { get; } - /// - /// Gets the authors of the extension (separated by commas). - /// - string Authors { get; } - } + /// + /// Gets the authors of the extension (separated by commas). + /// + string Authors { get; } } \ No newline at end of file diff --git a/src/ExtCore.Mvc.Infrastructure/Actions/IAddMvcAction.cs b/src/ExtCore.Mvc.Infrastructure/Actions/IAddMvcAction.cs index e38a3ea..a84006e 100644 --- a/src/ExtCore.Mvc.Infrastructure/Actions/IAddMvcAction.cs +++ b/src/ExtCore.Mvc.Infrastructure/Actions/IAddMvcAction.cs @@ -4,28 +4,27 @@ using System; using Microsoft.Extensions.DependencyInjection; -namespace ExtCore.Mvc.Infrastructure.Actions +namespace ExtCore.Mvc.Infrastructure.Actions; + +/// +/// Describes an action that must be executed inside the AddMvc method and might be used by the extensions +/// to configure the MVC. +/// +public interface IAddMvcAction { /// - /// Describes an action that must be executed inside the AddMvc method and might be used by the extensions - /// to configure the MVC. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). /// - public interface IAddMvcAction - { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - int Priority { get; } + int Priority { get; } - /// - /// Contains any code that must be executed inside the AddMvc method. - /// - /// - /// Will be provided by the ExtCore.Mvc and might be used to configure the MVC. - /// - /// - /// Will be provided by the ExtCore.Mvc and might be used to get any service that is registered inside the DI at this moment. - /// - void Execute(IMvcBuilder mvcBuilder, IServiceProvider serviceProvider); - } + /// + /// Contains any code that must be executed inside the AddMvc method. + /// + /// + /// Will be provided by the ExtCore.Mvc and might be used to configure the MVC. + /// + /// + /// Will be provided by the ExtCore.Mvc and might be used to get any service that is registered inside the DI at this moment. + /// + void Execute(IMvcBuilder mvcBuilder, IServiceProvider serviceProvider); } \ No newline at end of file diff --git a/src/ExtCore.Mvc.Infrastructure/Actions/IUseEndpointsAction.cs b/src/ExtCore.Mvc.Infrastructure/Actions/IUseEndpointsAction.cs index b456e58..9c815b9 100644 --- a/src/ExtCore.Mvc.Infrastructure/Actions/IUseEndpointsAction.cs +++ b/src/ExtCore.Mvc.Infrastructure/Actions/IUseEndpointsAction.cs @@ -4,28 +4,27 @@ using System; using Microsoft.AspNetCore.Routing; -namespace ExtCore.Mvc.Infrastructure.Actions +namespace ExtCore.Mvc.Infrastructure.Actions; + +/// +/// Describes an action that must be executed inside the UseEndpoints method and might be used by the extensions +/// to configure the endpoints. +/// +public interface IUseEndpointsAction { /// - /// Describes an action that must be executed inside the UseEndpoints method and might be used by the extensions - /// to configure the endpoints. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). /// - public interface IUseEndpointsAction - { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - int Priority { get; } + int Priority { get; } - /// - /// Contains any code that must be executed inside the UseEndpoints method. - /// - /// - /// Will be provided by the ExtCore.Mvc and might be used to configure the endpoints. - /// - /// - /// Will be provided by the ExtCore.Mvc and might be used to get any service that is registered inside the DI at this moment. - /// - void Execute(IEndpointRouteBuilder endpointRouteBuilder, IServiceProvider serviceProvider); - } + /// + /// Contains any code that must be executed inside the UseEndpoints method. + /// + /// + /// Will be provided by the ExtCore.Mvc and might be used to configure the endpoints. + /// + /// + /// Will be provided by the ExtCore.Mvc and might be used to get any service that is registered inside the DI at this moment. + /// + void Execute(IEndpointRouteBuilder endpointRouteBuilder, IServiceProvider serviceProvider); } \ No newline at end of file diff --git a/src/ExtCore.Mvc/Actions/AddMvcAction.cs b/src/ExtCore.Mvc/Actions/AddMvcAction.cs index 3150516..7d29d22 100644 --- a/src/ExtCore.Mvc/Actions/AddMvcAction.cs +++ b/src/ExtCore.Mvc/Actions/AddMvcAction.cs @@ -10,42 +10,41 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -namespace ExtCore.Mvc.Actions +namespace ExtCore.Mvc.Actions; + +/// +/// Implements the IConfigureServicesAction interface and +/// registers the MVC services inside the DI. +/// +public class AddMvcAction : IConfigureServicesAction { /// - /// Implements the IConfigureServicesAction interface and - /// registers the MVC services inside the DI. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). /// - public class AddMvcAction : IConfigureServicesAction - { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - public int Priority => 10000; + public int Priority => 10000; - /// - /// Registers the MVC services inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to register any service inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - public void Execute(IServiceCollection services, IServiceProvider serviceProvider) - { - IMvcBuilder mvcBuilder = services.AddMvc(); + /// + /// Registers the MVC services inside the DI. + /// + /// + /// Will be provided by the ExtCore and might be used to register any service inside the DI. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + public void Execute(IServiceCollection services, IServiceProvider serviceProvider) + { + IMvcBuilder mvcBuilder = services.AddMvc(); - foreach (Assembly assembly in ExtensionManager.Assemblies) - mvcBuilder.AddApplicationPart(assembly); + foreach (Assembly assembly in ExtensionManager.Assemblies) + mvcBuilder.AddApplicationPart(assembly); - foreach (IAddMvcAction action in ExtensionManager.GetInstances().OrderBy(a => a.Priority)) - { - ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Mvc"); + foreach (IAddMvcAction action in ExtensionManager.GetInstances().OrderBy(a => a.Priority)) + { + ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Mvc"); - logger.LogInformation("Executing AddMvc action '{0}'", action.GetType().FullName); - action.Execute(mvcBuilder, serviceProvider); - } + logger.LogInformation("Executing AddMvc action '{0}'", action.GetType().FullName); + action.Execute(mvcBuilder, serviceProvider); } } } \ No newline at end of file diff --git a/src/ExtCore.Mvc/Actions/AddStaticFilesAction.cs b/src/ExtCore.Mvc/Actions/AddStaticFilesAction.cs index e10fd7c..d058e7d 100644 --- a/src/ExtCore.Mvc/Actions/AddStaticFilesAction.cs +++ b/src/ExtCore.Mvc/Actions/AddStaticFilesAction.cs @@ -9,44 +9,43 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; -namespace ExtCore.Mvc.Actions +namespace ExtCore.Mvc.Actions; + +/// +/// Implements the IConfigureServicesAction interface and +/// creates and registers the composite file provider that contains resources from all the extensions. +/// +public class AddStaticFilesAction : IConfigureServicesAction { /// - /// Implements the IConfigureServicesAction interface and - /// creates and registers the composite file provider that contains resources from all the extensions. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). /// - public class AddStaticFilesAction : IConfigureServicesAction - { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - public int Priority => 1000; + public int Priority => 1000; - /// - /// Creates and registers the composite file provider that contains resources from all the extensions. - /// - /// - /// Will be provided by the ExtCore and might be used to register any service inside the DI. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - public void Execute(IServiceCollection services, IServiceProvider serviceProvider) - { - serviceProvider.GetService().WebRootFileProvider = this.CreateCompositeFileProvider(serviceProvider); - } + /// + /// Creates and registers the composite file provider that contains resources from all the extensions. + /// + /// + /// Will be provided by the ExtCore and might be used to register any service inside the DI. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + public void Execute(IServiceCollection services, IServiceProvider serviceProvider) + { + serviceProvider.GetService().WebRootFileProvider = this.CreateCompositeFileProvider(serviceProvider); + } - private IFileProvider CreateCompositeFileProvider(IServiceProvider serviceProvider) - { - IFileProvider[] fileProviders = new IFileProvider[] { - serviceProvider.GetService().WebRootFileProvider - }; + private IFileProvider CreateCompositeFileProvider(IServiceProvider serviceProvider) + { + IFileProvider[] fileProviders = new IFileProvider[] { + serviceProvider.GetService().WebRootFileProvider + }; - return new CompositeFileProvider( - fileProviders.Concat( - ExtensionManager.Assemblies.Select(a => new EmbeddedFileProvider(a, a.GetName().Name)) - ) - ); - } + return new CompositeFileProvider( + fileProviders.Concat( + ExtensionManager.Assemblies.Select(a => new EmbeddedFileProvider(a, a.GetName().Name)) + ) + ); } } \ No newline at end of file diff --git a/src/ExtCore.Mvc/Actions/UseEndpointsAction.cs b/src/ExtCore.Mvc/Actions/UseEndpointsAction.cs index 4b0d176..3eb5c8b 100644 --- a/src/ExtCore.Mvc/Actions/UseEndpointsAction.cs +++ b/src/ExtCore.Mvc/Actions/UseEndpointsAction.cs @@ -10,42 +10,41 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -namespace ExtCore.Mvc.Actions +namespace ExtCore.Mvc.Actions; + +/// +/// Implements the IConfigureAction interface and registers the +/// endpoints middleware inside a web application's request pipeline. +/// +public class UseEndpointsAction : IConfigureAction { /// - /// Implements the IConfigureAction interface and registers the - /// endpoints middleware inside a web application's request pipeline. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). /// - public class UseEndpointsAction : IConfigureAction - { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - public int Priority => 11000; + public int Priority => 11000; - /// - /// Registers the endpoints middleware inside a web application's request pipeline. - /// - /// - /// Will be provided by the ExtCore and might be used to configure a web application's request pipeline. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - public void Execute(IApplicationBuilder applicationBuilder, IServiceProvider serviceProvider) - { - applicationBuilder.UseEndpoints( - endpointRouteBuilder => + /// + /// Registers the endpoints middleware inside a web application's request pipeline. + /// + /// + /// Will be provided by the ExtCore and might be used to configure a web application's request pipeline. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + public void Execute(IApplicationBuilder applicationBuilder, IServiceProvider serviceProvider) + { + applicationBuilder.UseEndpoints( + endpointRouteBuilder => + { + foreach (IUseEndpointsAction action in ExtensionManager.GetInstances().OrderBy(a => a.Priority)) { - foreach (IUseEndpointsAction action in ExtensionManager.GetInstances().OrderBy(a => a.Priority)) - { - ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Mvc"); + ILogger logger = serviceProvider.GetService().CreateLogger("ExtCore.Mvc"); - logger.LogInformation("Executing UseEndpoints action '{0}'", action.GetType().FullName); - action.Execute(endpointRouteBuilder, serviceProvider); - } + logger.LogInformation("Executing UseEndpoints action '{0}'", action.GetType().FullName); + action.Execute(endpointRouteBuilder, serviceProvider); } - ); - } + } + ); } } \ No newline at end of file diff --git a/src/ExtCore.Mvc/Actions/UseRoutingAction.cs b/src/ExtCore.Mvc/Actions/UseRoutingAction.cs index 3cf552b..89b3318 100644 --- a/src/ExtCore.Mvc/Actions/UseRoutingAction.cs +++ b/src/ExtCore.Mvc/Actions/UseRoutingAction.cs @@ -5,31 +5,30 @@ using ExtCore.Infrastructure.Actions; using Microsoft.AspNetCore.Builder; -namespace ExtCore.Mvc.Actions +namespace ExtCore.Mvc.Actions; + +/// +/// Implements the IConfigureAction interface and registers the +/// routing middleware inside a web application's request pipeline. +/// +public class UseRoutingAction : IConfigureAction { /// - /// Implements the IConfigureAction interface and registers the - /// routing middleware inside a web application's request pipeline. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). /// - public class UseRoutingAction : IConfigureAction - { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - public int Priority => 10000; + public int Priority => 10000; - /// - /// Registers the routing middleware inside a web application's request pipeline. - /// - /// - /// Will be provided by the ExtCore and might be used to configure a web application's request pipeline. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - public void Execute(IApplicationBuilder applicationBuilder, IServiceProvider serviceProvider) - { - applicationBuilder.UseRouting(); - } + /// + /// Registers the routing middleware inside a web application's request pipeline. + /// + /// + /// Will be provided by the ExtCore and might be used to configure a web application's request pipeline. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + public void Execute(IApplicationBuilder applicationBuilder, IServiceProvider serviceProvider) + { + applicationBuilder.UseRouting(); } } \ No newline at end of file diff --git a/src/ExtCore.Mvc/Actions/UseStaticFilesAction.cs b/src/ExtCore.Mvc/Actions/UseStaticFilesAction.cs index 035d751..d675ffa 100644 --- a/src/ExtCore.Mvc/Actions/UseStaticFilesAction.cs +++ b/src/ExtCore.Mvc/Actions/UseStaticFilesAction.cs @@ -7,34 +7,33 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -namespace ExtCore.Mvc.Actions +namespace ExtCore.Mvc.Actions; + +/// +/// Implements the IConfigureAction interface and registers the +/// static files middleware inside a web application's request pipeline. +/// +public class UseStaticFilesAction : IConfigureAction { /// - /// Implements the IConfigureAction interface and registers the - /// static files middleware inside a web application's request pipeline. + /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). /// - public class UseStaticFilesAction : IConfigureAction - { - /// - /// Priority of the action. The actions will be executed in the order specified by the priority (from smallest to largest). - /// - public int Priority => 1000; + public int Priority => 1000; - /// - /// Registers the static files middleware inside a web application's request pipeline. - /// - /// - /// - /// Will be provided by the ExtCore and might be used to configure a web application's request pipeline. - /// - /// - /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. - /// - public void Execute(IApplicationBuilder applicationBuilder, IServiceProvider serviceProvider) - { - IOptions options = serviceProvider.GetService>(); + /// + /// Registers the static files middleware inside a web application's request pipeline. + /// + /// + /// + /// Will be provided by the ExtCore and might be used to configure a web application's request pipeline. + /// + /// + /// Will be provided by the ExtCore and might be used to get any service that is registered inside the DI at this moment. + /// + public void Execute(IApplicationBuilder applicationBuilder, IServiceProvider serviceProvider) + { + IOptions options = serviceProvider.GetService>(); - applicationBuilder.UseStaticFiles(options?.Value); - } + applicationBuilder.UseStaticFiles(options?.Value); } } \ No newline at end of file diff --git a/src/ExtCore.Mvc/Extension.cs b/src/ExtCore.Mvc/Extension.cs index 932b886..5feb9f0 100644 --- a/src/ExtCore.Mvc/Extension.cs +++ b/src/ExtCore.Mvc/Extension.cs @@ -3,31 +3,30 @@ using ExtCore.Infrastructure; -namespace ExtCore.Mvc +namespace ExtCore.Mvc; + +/// +/// Overrides the ExtensionBase class and provides the ExtCore.Mvc extension information. +/// +public class Extension : ExtensionBase { /// - /// Overrides the ExtensionBase class and provides the ExtCore.Mvc extension information. + /// Gets the name of the extension. /// - public class Extension : ExtensionBase - { - /// - /// Gets the name of the extension. - /// - public override string Name => "ExtCore.Mvc"; + public override string Name => "ExtCore.Mvc"; - /// - /// Gets the URL of the extension. - /// - public override string Url => "https://extcore.net/"; + /// + /// Gets the URL of the extension. + /// + public override string Url => "https://extcore.net/"; - /// - /// Gets the version of the extension. - /// - public override string Version => "8.1.0"; + /// + /// Gets the version of the extension. + /// + public override string Version => "8.1.0"; - /// - /// Gets the authors of the extension (separated by commas). - /// - public override string Authors => "Dmitry Sikorsky"; - } + /// + /// Gets the authors of the extension (separated by commas). + /// + public override string Authors => "Dmitry Sikorsky"; } \ No newline at end of file diff --git a/src/ExtCore.WebApplication/DefaultAssemblyProvider.cs b/src/ExtCore.WebApplication/DefaultAssemblyProvider.cs index bdb0009..b16a244 100644 --- a/src/ExtCore.WebApplication/DefaultAssemblyProvider.cs +++ b/src/ExtCore.WebApplication/DefaultAssemblyProvider.cs @@ -11,137 +11,136 @@ using Microsoft.Extensions.DependencyModel; using Microsoft.Extensions.Logging; -namespace ExtCore.WebApplication +namespace ExtCore.WebApplication; + +/// +/// Implements the IAssemblyProvider interface and represents +/// default assembly provider that gets assemblies from a specific path and web application dependencies +/// with the ability to filter the discovered assemblies with the IsCandidateAssembly and +/// IsCandidateCompilationLibrary predicates. +/// +public class DefaultAssemblyProvider : IAssemblyProvider { + protected ILogger logger; + + /// + /// Gets or sets the predicate that is used to filter discovered assemblies from a specific folder + /// before thay have been added to the resulting assemblies set. + /// + public Func IsCandidateAssembly { get; set; } + + /// + /// Gets or sets the predicate that is used to filter discovered libraries from a web application dependencies + /// before thay have been added to the resulting assemblies set. + /// + public Func IsCandidateCompilationLibrary { get; set; } + /// - /// Implements the IAssemblyProvider interface and represents - /// default assembly provider that gets assemblies from a specific path and web application dependencies - /// with the ability to filter the discovered assemblies with the IsCandidateAssembly and - /// IsCandidateCompilationLibrary predicates. + /// Initializes a new instance of the AssemblyProvider class. /// - public class DefaultAssemblyProvider : IAssemblyProvider + /// The service provider that is used to create a logger. + public DefaultAssemblyProvider(IServiceProvider serviceProvider) { - protected ILogger logger; - - /// - /// Gets or sets the predicate that is used to filter discovered assemblies from a specific folder - /// before thay have been added to the resulting assemblies set. - /// - public Func IsCandidateAssembly { get; set; } - - /// - /// Gets or sets the predicate that is used to filter discovered libraries from a web application dependencies - /// before thay have been added to the resulting assemblies set. - /// - public Func IsCandidateCompilationLibrary { get; set; } - - /// - /// Initializes a new instance of the AssemblyProvider class. - /// - /// The service provider that is used to create a logger. - public DefaultAssemblyProvider(IServiceProvider serviceProvider) - { - this.logger = serviceProvider.GetService().CreateLogger("ExtCore.WebApplication"); - this.IsCandidateAssembly = assembly => - !assembly.FullName.StartsWith("System", StringComparison.OrdinalIgnoreCase) && - !assembly.FullName.StartsWith("Microsoft", StringComparison.OrdinalIgnoreCase); - - this.IsCandidateCompilationLibrary = library => - !library.Name.StartsWith("mscorlib", StringComparison.OrdinalIgnoreCase) && - !library.Name.StartsWith("netstandard", StringComparison.OrdinalIgnoreCase) && - !library.Name.StartsWith("System", StringComparison.OrdinalIgnoreCase) && - !library.Name.StartsWith("Microsoft", StringComparison.OrdinalIgnoreCase) && - !library.Name.StartsWith("WindowsBase", StringComparison.OrdinalIgnoreCase); - } + this.logger = serviceProvider.GetService().CreateLogger("ExtCore.WebApplication"); + this.IsCandidateAssembly = assembly => + !assembly.FullName.StartsWith("System", StringComparison.OrdinalIgnoreCase) && + !assembly.FullName.StartsWith("Microsoft", StringComparison.OrdinalIgnoreCase); + + this.IsCandidateCompilationLibrary = library => + !library.Name.StartsWith("mscorlib", StringComparison.OrdinalIgnoreCase) && + !library.Name.StartsWith("netstandard", StringComparison.OrdinalIgnoreCase) && + !library.Name.StartsWith("System", StringComparison.OrdinalIgnoreCase) && + !library.Name.StartsWith("Microsoft", StringComparison.OrdinalIgnoreCase) && + !library.Name.StartsWith("WindowsBase", StringComparison.OrdinalIgnoreCase); + } - /// - /// Discovers and then gets the discovered assemblies from a specific folder and web application dependencies. - /// - /// The extensions path of a web application. - /// - /// Determines whether a web application will discover and then get the discovered assemblies from the subfolders - /// of a specific folder recursively. - /// - /// The discovered and loaded assemblies. - public IEnumerable GetAssemblies(string path, bool includingSubpaths) - { - List assemblies = new List(); + /// + /// Discovers and then gets the discovered assemblies from a specific folder and web application dependencies. + /// + /// The extensions path of a web application. + /// + /// Determines whether a web application will discover and then get the discovered assemblies from the subfolders + /// of a specific folder recursively. + /// + /// The discovered and loaded assemblies. + public IEnumerable GetAssemblies(string path, bool includingSubpaths) + { + List assemblies = new List(); - this.GetAssembliesFromDependencyContext(assemblies); - this.GetAssembliesFromPath(assemblies, path, includingSubpaths); - return assemblies; - } + this.GetAssembliesFromDependencyContext(assemblies); + this.GetAssembliesFromPath(assemblies, path, includingSubpaths); + return assemblies; + } - private void GetAssembliesFromDependencyContext(List assemblies) - { - this.logger.LogInformation("Discovering and loading assemblies from DependencyContext"); + private void GetAssembliesFromDependencyContext(List assemblies) + { + this.logger.LogInformation("Discovering and loading assemblies from DependencyContext"); - foreach (CompilationLibrary compilationLibrary in DependencyContext.Default.CompileLibraries) + foreach (CompilationLibrary compilationLibrary in DependencyContext.Default.CompileLibraries) + { + if (this.IsCandidateCompilationLibrary(compilationLibrary)) { - if (this.IsCandidateCompilationLibrary(compilationLibrary)) + Assembly assembly = null; + + try { - Assembly assembly = null; + assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(compilationLibrary.Name)); - try + if (!assemblies.Any(a => string.Equals(a.FullName, assembly.FullName, StringComparison.OrdinalIgnoreCase))) { - assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(compilationLibrary.Name)); - - if (!assemblies.Any(a => string.Equals(a.FullName, assembly.FullName, StringComparison.OrdinalIgnoreCase))) - { - assemblies.Add(assembly); - this.logger.LogInformation("Assembly '{0}' is discovered and loaded", assembly.FullName); - } + assemblies.Add(assembly); + this.logger.LogInformation("Assembly '{0}' is discovered and loaded", assembly.FullName); } + } - catch (Exception e) - { - this.logger.LogWarning("Error loading assembly '{0}'", compilationLibrary.Name); - this.logger.LogWarning(e.ToString()); - } + catch (Exception e) + { + this.logger.LogWarning("Error loading assembly '{0}'", compilationLibrary.Name); + this.logger.LogWarning(e.ToString()); } } } + } - private void GetAssembliesFromPath(List assemblies, string path, bool includingSubpaths) + private void GetAssembliesFromPath(List assemblies, string path, bool includingSubpaths) + { + if (!string.IsNullOrEmpty(path) && Directory.Exists(path)) { - if (!string.IsNullOrEmpty(path) && Directory.Exists(path)) + this.logger.LogInformation("Discovering and loading assemblies from path '{0}'", path); + + foreach (string extensionPath in Directory.EnumerateFiles(path, "*.dll")) { - this.logger.LogInformation("Discovering and loading assemblies from path '{0}'", path); + Assembly assembly = null; - foreach (string extensionPath in Directory.EnumerateFiles(path, "*.dll")) + try { - Assembly assembly = null; + assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(extensionPath); - try + if (this.IsCandidateAssembly(assembly) && !assemblies.Any(a => string.Equals(a.FullName, assembly.FullName, StringComparison.OrdinalIgnoreCase))) { - assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(extensionPath); - - if (this.IsCandidateAssembly(assembly) && !assemblies.Any(a => string.Equals(a.FullName, assembly.FullName, StringComparison.OrdinalIgnoreCase))) - { - assemblies.Add(assembly); - this.logger.LogInformation("Assembly '{0}' is discovered and loaded", assembly.FullName); - } - } - - catch (Exception e) - { - this.logger.LogWarning("Error loading assembly '{0}'", extensionPath); - this.logger.LogWarning(e.ToString()); + assemblies.Add(assembly); + this.logger.LogInformation("Assembly '{0}' is discovered and loaded", assembly.FullName); } } - if (includingSubpaths) - foreach (string subpath in Directory.GetDirectories(path)) - this.GetAssembliesFromPath(assemblies, subpath, includingSubpaths); + catch (Exception e) + { + this.logger.LogWarning("Error loading assembly '{0}'", extensionPath); + this.logger.LogWarning(e.ToString()); + } } - else - { - if (string.IsNullOrEmpty(path)) - this.logger.LogWarning("Discovering and loading assemblies from path skipped: path not provided", path); + if (includingSubpaths) + foreach (string subpath in Directory.GetDirectories(path)) + this.GetAssembliesFromPath(assemblies, subpath, includingSubpaths); + } - else this.logger.LogWarning("Discovering and loading assemblies from path '{0}' skipped: path not found", path); - } + else + { + if (string.IsNullOrEmpty(path)) + this.logger.LogWarning("Discovering and loading assemblies from path skipped: path not provided", path); + + else this.logger.LogWarning("Discovering and loading assemblies from path '{0}' skipped: path not found", path); } } } \ No newline at end of file diff --git a/src/ExtCore.WebApplication/Extensions/ApplicationBuilderExtensions.cs b/src/ExtCore.WebApplication/Extensions/ApplicationBuilderExtensions.cs index 59d9ba9..e8ba63f 100644 --- a/src/ExtCore.WebApplication/Extensions/ApplicationBuilderExtensions.cs +++ b/src/ExtCore.WebApplication/Extensions/ApplicationBuilderExtensions.cs @@ -8,29 +8,28 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -namespace ExtCore.WebApplication.Extensions +namespace ExtCore.WebApplication.Extensions; + +/// +/// Contains the extension methods of the IApplicationBuilder interface. +/// +public static class ApplicationBuilderExtensions { /// - /// Contains the extension methods of the IApplicationBuilder interface. + /// Executes the Configure actions from all the extensions. It must be called inside the Configure method + /// of the web application's Startup class in order ExtCore to work properly. /// - public static class ApplicationBuilderExtensions + /// + /// The application builder passed to the Configure method of the web application's Startup class. + /// + public static void UseExtCore(this IApplicationBuilder applicationBuilder) { - /// - /// Executes the Configure actions from all the extensions. It must be called inside the Configure method - /// of the web application's Startup class in order ExtCore to work properly. - /// - /// - /// The application builder passed to the Configure method of the web application's Startup class. - /// - public static void UseExtCore(this IApplicationBuilder applicationBuilder) - { - ILogger logger = applicationBuilder.ApplicationServices.GetService().CreateLogger("ExtCore.WebApplication"); + ILogger logger = applicationBuilder.ApplicationServices.GetService().CreateLogger("ExtCore.WebApplication"); - foreach (IConfigureAction action in ExtensionManager.GetInstances().OrderBy(a => a.Priority)) - { - logger.LogInformation("Executing Configure action '{0}'", action.GetType().FullName); - action.Execute(applicationBuilder, applicationBuilder.ApplicationServices); - } + foreach (IConfigureAction action in ExtensionManager.GetInstances().OrderBy(a => a.Priority)) + { + logger.LogInformation("Executing Configure action '{0}'", action.GetType().FullName); + action.Execute(applicationBuilder, applicationBuilder.ApplicationServices); } } } \ No newline at end of file diff --git a/src/ExtCore.WebApplication/IAssemblyProvider.cs b/src/ExtCore.WebApplication/IAssemblyProvider.cs index 450cadf..e2187dd 100644 --- a/src/ExtCore.WebApplication/IAssemblyProvider.cs +++ b/src/ExtCore.WebApplication/IAssemblyProvider.cs @@ -4,25 +4,24 @@ using System.Collections.Generic; using System.Reflection; -namespace ExtCore.WebApplication +namespace ExtCore.WebApplication; + +/// +/// Describes an assembly provider with the mechanism of getting assemblies that should be involved +/// in the ExtCore types discovering process. +/// +public interface IAssemblyProvider { /// - /// Describes an assembly provider with the mechanism of getting assemblies that should be involved - /// in the ExtCore types discovering process. + /// Discovers and then gets the discovered assemblies. /// - public interface IAssemblyProvider - { - /// - /// Discovers and then gets the discovered assemblies. - /// - /// The extensions path of a web application. Might be used or ignored - /// by an implementation of the IAssemblyProvider interface. - /// - /// Determines whether a web application will discover and then get the discovered assemblies from the subfolders - /// of a specific folder recursively. Might be used or ignored by an implementation of the - /// IAssemblyProvider interface. - /// - /// The discovered and loaded assemblies. - IEnumerable GetAssemblies(string path, bool includingSubpaths); - } + /// The extensions path of a web application. Might be used or ignored + /// by an implementation of the IAssemblyProvider interface. + /// + /// Determines whether a web application will discover and then get the discovered assemblies from the subfolders + /// of a specific folder recursively. Might be used or ignored by an implementation of the + /// IAssemblyProvider interface. + /// + /// The discovered and loaded assemblies. + IEnumerable GetAssemblies(string path, bool includingSubpaths); } \ No newline at end of file From e39b856c33acbfc196c4b81408a4bddaf23cee1b Mon Sep 17 00:00:00 2001 From: Gorbach Oleksii Date: Wed, 22 Feb 2023 12:34:54 +0100 Subject: [PATCH 11/13] fix spelling --- src/ExtCore.WebApplication/DefaultAssemblyProvider.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ExtCore.WebApplication/DefaultAssemblyProvider.cs b/src/ExtCore.WebApplication/DefaultAssemblyProvider.cs index b16a244..df3d3f7 100644 --- a/src/ExtCore.WebApplication/DefaultAssemblyProvider.cs +++ b/src/ExtCore.WebApplication/DefaultAssemblyProvider.cs @@ -25,13 +25,13 @@ public class DefaultAssemblyProvider : IAssemblyProvider /// /// Gets or sets the predicate that is used to filter discovered assemblies from a specific folder - /// before thay have been added to the resulting assemblies set. + /// before they have been added to the resulting assemblies set. /// public Func IsCandidateAssembly { get; set; } /// /// Gets or sets the predicate that is used to filter discovered libraries from a web application dependencies - /// before thay have been added to the resulting assemblies set. + /// before they have been added to the resulting assemblies set. /// public Func IsCandidateCompilationLibrary { get; set; } @@ -143,4 +143,4 @@ private void GetAssembliesFromPath(List assemblies, string path, bool else this.logger.LogWarning("Discovering and loading assemblies from path '{0}' skipped: path not found", path); } } -} \ No newline at end of file +} From e32da7fc935e39a3d9f717ff48aa87e19dd2ddde Mon Sep 17 00:00:00 2001 From: Dmitry Sikorsky Date: Sat, 25 Feb 2023 18:28:47 +0200 Subject: [PATCH 12/13] Moved common.props file to src directory --- src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj | 2 +- src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj | 2 +- .../ExtCore.Data.Dapper.PostgreSql.csproj | 2 +- .../ExtCore.Data.Dapper.SqlServer.csproj | 2 +- .../ExtCore.Data.Dapper.Sqlite.csproj | 2 +- src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj | 2 +- .../ExtCore.Data.Entities.Abstractions.csproj | 2 +- .../ExtCore.Data.EntityFramework.MySql.csproj | 2 +- .../ExtCore.Data.EntityFramework.PostgreSql.csproj | 2 +- .../ExtCore.Data.EntityFramework.SqlServer.csproj | 2 +- .../ExtCore.Data.EntityFramework.Sqlite.csproj | 2 +- .../ExtCore.Data.EntityFramework.csproj | 2 +- src/ExtCore.Data/ExtCore.Data.csproj | 2 +- src/ExtCore.Events/ExtCore.Events.csproj | 2 +- .../ExtCore.FileStorage.Abstractions.csproj | 2 +- src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj | 2 +- .../ExtCore.FileStorage.Dropbox.csproj | 2 +- .../ExtCore.FileStorage.FileSystem.csproj | 2 +- src/ExtCore.FileStorage/ExtCore.FileStorage.csproj | 2 +- src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj | 2 +- .../ExtCore.Mvc.Infrastructure.csproj | 2 +- src/ExtCore.Mvc/ExtCore.Mvc.csproj | 2 +- src/ExtCore.WebApplication/ExtCore.WebApplication.csproj | 2 +- common.props => src/common.props | 0 24 files changed, 23 insertions(+), 23 deletions(-) rename common.props => src/common.props (100%) diff --git a/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj b/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj index b16ff48..186297d 100644 --- a/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj +++ b/src/ExtCore.Data.Abstractions/ExtCore.Data.Abstractions.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj index 5d40a97..dff35c5 100644 --- a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj +++ b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj index dc16eff..a7bed26 100644 --- a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj +++ b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj index b63d7f9..2c540ee 100644 --- a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj +++ b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj index 6d6e2da..eaa8645 100644 --- a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj +++ b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj index ebdce7c..6d5adaf 100644 --- a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj +++ b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj b/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj index 4cf297d..023a3dd 100644 --- a/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj +++ b/src/ExtCore.Data.Entities.Abstractions/ExtCore.Data.Entities.Abstractions.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj index 750c8f0..b6d3d21 100644 --- a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj +++ b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj index 94a7c08..d2bb199 100644 --- a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj +++ b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj index 88c0cfd..5df755b 100644 --- a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj +++ b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj index 0d593c2..dfae20f 100644 --- a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj +++ b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj index 948ae05..8337f83 100644 --- a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj +++ b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Data/ExtCore.Data.csproj b/src/ExtCore.Data/ExtCore.Data.csproj index e9f4774..7f1ab9f 100644 --- a/src/ExtCore.Data/ExtCore.Data.csproj +++ b/src/ExtCore.Data/ExtCore.Data.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Data extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Events/ExtCore.Events.csproj b/src/ExtCore.Events/ExtCore.Events.csproj index 3036ba1..5372116 100644 --- a/src/ExtCore.Events/ExtCore.Events.csproj +++ b/src/ExtCore.Events/ExtCore.Events.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Events extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj b/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj index b85c805..84dc73d 100644 --- a/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj +++ b/src/ExtCore.FileStorage.Abstractions/ExtCore.FileStorage.Abstractions.csproj @@ -1,5 +1,5 @@  - + The ExtCore.FileStorage extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj index 0440247..02392ad 100644 --- a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj +++ b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj @@ -1,5 +1,5 @@ - + The ExtCore.FileStorage extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj index 3c64647..33dc972 100644 --- a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj +++ b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj @@ -1,5 +1,5 @@  - + The ExtCore.FileStorage extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj index 53580b0..6bb85d1 100644 --- a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj +++ b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj @@ -1,5 +1,5 @@  - + The ExtCore.FileStorage extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj index 3762844..6d7fa8a 100644 --- a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj +++ b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj @@ -1,5 +1,5 @@  - + The ExtCore.FileStorage extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj index eb3e27c..df4a81a 100644 --- a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj +++ b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj @@ -1,5 +1,5 @@  - + Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. diff --git a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj index 0eb7813..f12133d 100644 --- a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj +++ b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Mvc extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.Mvc/ExtCore.Mvc.csproj b/src/ExtCore.Mvc/ExtCore.Mvc.csproj index 3ff78c1..c86aa82 100644 --- a/src/ExtCore.Mvc/ExtCore.Mvc.csproj +++ b/src/ExtCore.Mvc/ExtCore.Mvc.csproj @@ -1,5 +1,5 @@  - + The ExtCore.Mvc extension component. Based on the ExtCore framework. diff --git a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj index af8bc5c..1bd4106 100644 --- a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj +++ b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj @@ -1,5 +1,5 @@  - + Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. diff --git a/common.props b/src/common.props similarity index 100% rename from common.props rename to src/common.props From 3d10fcb358e3828b42e138fbbc942ef14fd2fe2a Mon Sep 17 00:00:00 2001 From: Dmitry Sikorsky Date: Thu, 6 Jun 2024 14:10:17 +0300 Subject: [PATCH 13/13] Updated to .NET 8 --- README.md | 30 +++++++++---------- .../ExtCore.Data.Dapper.MySql.csproj | 4 +-- .../ExtCore.Data.Dapper.PostgreSql.csproj | 4 +-- .../ExtCore.Data.Dapper.SqlServer.csproj | 2 +- .../ExtCore.Data.Dapper.Sqlite.csproj | 4 +-- .../ExtCore.Data.Dapper.csproj | 4 +-- .../ExtCore.Data.EntityFramework.MySql.csproj | 4 +-- ...ore.Data.EntityFramework.PostgreSql.csproj | 4 +-- ...Core.Data.EntityFramework.SqlServer.csproj | 4 +-- ...ExtCore.Data.EntityFramework.Sqlite.csproj | 4 +-- .../ExtCore.Data.EntityFramework.csproj | 4 +-- src/ExtCore.Data/ExtCore.Data.csproj | 2 +- src/ExtCore.Events/ExtCore.Events.csproj | 2 +- .../ExtCore.FileStorage.Azure.csproj | 6 ++-- .../ExtCore.FileStorage.Dropbox.csproj | 4 +-- .../ExtCore.FileStorage.FileSystem.csproj | 2 +- .../ExtCore.FileStorage.csproj | 2 +- .../ExtCore.Infrastructure.csproj | 2 +- .../ExtCore.Mvc.Infrastructure.csproj | 2 +- src/ExtCore.Mvc/ExtCore.Mvc.csproj | 4 +-- .../ExtCore.WebApplication.csproj | 4 +-- src/common.props | 2 +- 22 files changed, 50 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 19134b1..6588949 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ExtCore 8.1.0 +# ExtCore 9.0.0 [![Join the chat at https://gitter.im/ExtCore/ExtCore](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ExtCore/ExtCore?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -93,20 +93,20 @@ in order to execute some code inside the ConfigureServices and Configure methods Please take a look at our samples on GitHub: -* [Full-featured ExtCore 7.0.0 framework sample web application](https://github.com/ExtCore/ExtCore-Sample); -* [ExtCore framework 7.0.0 sample simplest web application](https://github.com/ExtCore/ExtCore-Sample-Simplest); -* [ExtCore framework 7.0.0 sample MVC web application](https://github.com/ExtCore/ExtCore-Sample-Mvc); -* [ExtCore framework 7.0.0 sample web application that uses file storage](https://github.com/ExtCore/ExtCore-Sample-FileStorage); -* [ExtCore framework 7.0.0 sample web application that uses a database](https://github.com/ExtCore/ExtCore-Sample-Data); -* [ExtCore framework 7.0.0 sample web application that uses Identity](https://github.com/ExtCore/ExtCore-Sample-Identity); -* [ExtCore framework 7.0.0 sample web application with modular UI](https://github.com/ExtCore/ExtCore-Sample-Modular-Ui); -* [ExtCore framework 7.0.0 advanced sample web application with modular UI](https://github.com/ExtCore/ExtCore-Sample-Modular-Ui-Adv); -* [ExtCore framework 7.0.0 advanced sample accounting web application](https://github.com/ExtCore/ExtCore-Sample-Accounting); -* [ExtCore framework 7.0.0 sample web application that registers a service inside the extension](https://github.com/ExtCore/ExtCore-Sample-Service); -* [ExtCore framework 7.0.0 sample web application that uses the events](https://github.com/ExtCore/ExtCore-Sample-Events); -* [ExtCore framework 7.0.0 sample API web application](https://github.com/ExtCore/ExtCore-Sample-Api). - -You can also download our [ready to use full-featured sample](http://extcore.net/files/ExtCore-Sample-7.0.0.zip). +* [Full-featured ExtCore 9.0.0 framework sample web application](https://github.com/ExtCore/ExtCore-Sample); +* [ExtCore framework 9.0.0 sample simplest web application](https://github.com/ExtCore/ExtCore-Sample-Simplest); +* [ExtCore framework 9.0.0 sample MVC web application](https://github.com/ExtCore/ExtCore-Sample-Mvc); +* [ExtCore framework 9.0.0 sample web application that uses file storage](https://github.com/ExtCore/ExtCore-Sample-FileStorage); +* [ExtCore framework 9.0.0 sample web application that uses a database](https://github.com/ExtCore/ExtCore-Sample-Data); +* [ExtCore framework 9.0.0 sample web application that uses Identity](https://github.com/ExtCore/ExtCore-Sample-Identity); +* [ExtCore framework 9.0.0 sample web application with modular UI](https://github.com/ExtCore/ExtCore-Sample-Modular-Ui); +* [ExtCore framework 9.0.0 advanced sample web application with modular UI](https://github.com/ExtCore/ExtCore-Sample-Modular-Ui-Adv); +* [ExtCore framework 9.0.0 advanced sample accounting web application](https://github.com/ExtCore/ExtCore-Sample-Accounting); +* [ExtCore framework 9.0.0 sample web application that registers a service inside the extension](https://github.com/ExtCore/ExtCore-Sample-Service); +* [ExtCore framework 9.0.0 sample web application that uses the events](https://github.com/ExtCore/ExtCore-Sample-Events); +* [ExtCore framework 9.0.0 sample API web application](https://github.com/ExtCore/ExtCore-Sample-Api). + +You can also download our [ready to use full-featured sample](http://extcore.net/files/ExtCore-Sample-9.0.0.zip). It contains everything you need to run ExtCore-based web application from Visual Studio 2022, including SQLite database with the test data. diff --git a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj index dff35c5..874a62b 100644 --- a/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj +++ b/src/ExtCore.Data.Dapper.MySql/ExtCore.Data.Dapper.MySql.csproj @@ -3,13 +3,13 @@ The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.Dapper.MySql ExtCore.Data.Dapper.MySql - + diff --git a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj index a7bed26..1796e32 100644 --- a/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj +++ b/src/ExtCore.Data.Dapper.PostgreSql/ExtCore.Data.Dapper.PostgreSql.csproj @@ -3,13 +3,13 @@ The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.Dapper.PostgreSql ExtCore.Data.Dapper.PostgreSql - + diff --git a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj index 2c540ee..87694c6 100644 --- a/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj +++ b/src/ExtCore.Data.Dapper.SqlServer/ExtCore.Data.Dapper.SqlServer.csproj @@ -3,7 +3,7 @@ The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.Dapper.SqlServer ExtCore.Data.Dapper.SqlServer diff --git a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj index eaa8645..bb9ba4b 100644 --- a/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj +++ b/src/ExtCore.Data.Dapper.Sqlite/ExtCore.Data.Dapper.Sqlite.csproj @@ -3,13 +3,13 @@ The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.Dapper.Sqlite ExtCore.Data.Dapper.Sqlite - + diff --git a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj index 6d5adaf..367721d 100644 --- a/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj +++ b/src/ExtCore.Data.Dapper/ExtCore.Data.Dapper.csproj @@ -3,13 +3,13 @@ The ExtCore.Data.Dapper extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.Dapper ExtCore.Data.Dapper - + diff --git a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj index b6d3d21..41554ce 100644 --- a/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj +++ b/src/ExtCore.Data.EntityFramework.MySql/ExtCore.Data.EntityFramework.MySql.csproj @@ -3,13 +3,13 @@ The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.EntityFramework.MySql ExtCore.Data.EntityFramework.MySql - + diff --git a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj index d2bb199..a0f4bbf 100644 --- a/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj +++ b/src/ExtCore.Data.EntityFramework.PostgreSql/ExtCore.Data.EntityFramework.PostgreSql.csproj @@ -3,13 +3,13 @@ The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.EntityFramework.PostgreSql ExtCore.Data.EntityFramework.PostgreSql - + diff --git a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj index 5df755b..b9a464a 100644 --- a/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj +++ b/src/ExtCore.Data.EntityFramework.SqlServer/ExtCore.Data.EntityFramework.SqlServer.csproj @@ -3,13 +3,13 @@ The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.EntityFramework.SqlServer ExtCore.Data.EntityFramework.SqlServer - + diff --git a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj index dfae20f..ec6bad0 100644 --- a/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj +++ b/src/ExtCore.Data.EntityFramework.Sqlite/ExtCore.Data.EntityFramework.Sqlite.csproj @@ -3,13 +3,13 @@ The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.EntityFramework.Sqlite ExtCore.Data.EntityFramework.Sqlite - + diff --git a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj index 8337f83..40f1857 100644 --- a/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj +++ b/src/ExtCore.Data.EntityFramework/ExtCore.Data.EntityFramework.csproj @@ -3,13 +3,13 @@ The ExtCore.Data.EntityFramework extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data.EntityFramework ExtCore.Data.EntityFramework - + diff --git a/src/ExtCore.Data/ExtCore.Data.csproj b/src/ExtCore.Data/ExtCore.Data.csproj index 7f1ab9f..dcd0e80 100644 --- a/src/ExtCore.Data/ExtCore.Data.csproj +++ b/src/ExtCore.Data/ExtCore.Data.csproj @@ -3,7 +3,7 @@ The ExtCore.Data extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Data ExtCore.Data diff --git a/src/ExtCore.Events/ExtCore.Events.csproj b/src/ExtCore.Events/ExtCore.Events.csproj index 5372116..6a91583 100644 --- a/src/ExtCore.Events/ExtCore.Events.csproj +++ b/src/ExtCore.Events/ExtCore.Events.csproj @@ -3,7 +3,7 @@ The ExtCore.Events extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Events ExtCore.Events diff --git a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj index 02392ad..07eb781 100644 --- a/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj +++ b/src/ExtCore.FileStorage.Azure/ExtCore.FileStorage.Azure.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj index 33dc972..46dcec9 100644 --- a/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj +++ b/src/ExtCore.FileStorage.Dropbox/ExtCore.FileStorage.Dropbox.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj index 6bb85d1..a5e0087 100644 --- a/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj +++ b/src/ExtCore.FileStorage.FileSystem/ExtCore.FileStorage.FileSystem.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj index 6d7fa8a..69afbe7 100644 --- a/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj +++ b/src/ExtCore.FileStorage/ExtCore.FileStorage.csproj @@ -3,7 +3,7 @@ The ExtCore.FileStorage extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.FileStorage ExtCore.FileStorage diff --git a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj index df4a81a..3fe4246 100644 --- a/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj +++ b/src/ExtCore.Infrastructure/ExtCore.Infrastructure.csproj @@ -3,7 +3,7 @@ Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. - net7.0 + net8.0 ExtCore.Infrastructure ExtCore.Infrastructure diff --git a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj index f12133d..37932e2 100644 --- a/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj +++ b/src/ExtCore.Mvc.Infrastructure/ExtCore.Mvc.Infrastructure.csproj @@ -3,7 +3,7 @@ The ExtCore.Mvc extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Mvc.Infrastructure ExtCore.Mvc.Infrastructure diff --git a/src/ExtCore.Mvc/ExtCore.Mvc.csproj b/src/ExtCore.Mvc/ExtCore.Mvc.csproj index c86aa82..3a59bef 100644 --- a/src/ExtCore.Mvc/ExtCore.Mvc.csproj +++ b/src/ExtCore.Mvc/ExtCore.Mvc.csproj @@ -3,13 +3,13 @@ The ExtCore.Mvc extension component. Based on the ExtCore framework. - net7.0 + net8.0 ExtCore.Mvc ExtCore.Mvc - + diff --git a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj index 1bd4106..e3f1638 100644 --- a/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj +++ b/src/ExtCore.WebApplication/ExtCore.WebApplication.csproj @@ -3,13 +3,13 @@ Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core. - net7.0 + net8.0 ExtCore.WebApplication ExtCore.WebApplication - + diff --git a/src/common.props b/src/common.props index ba9fe54..6c58c1a 100644 --- a/src/common.props +++ b/src/common.props @@ -3,7 +3,7 @@ Dmitry Sikorsky Copyright © 2015 Dmitry Sikorsky - 8.1.0 + 9.0.0 latest icon.png https://extcore.net