From 30451f12cc4987a521f9ba8c97e0f74020709049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Thu, 24 Nov 2022 17:54:47 +0300 Subject: [PATCH 01/86] toaster text alignment --- .../theme-shared/src/lib/components/toast/toast.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html index 25db3a12e0..bff6e7dee9 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html @@ -2,7 +2,7 @@
-
+
From 17cc955c8eba3b8257c5260c073c809e50164cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Fri, 25 Nov 2022 12:17:29 +0300 Subject: [PATCH 02/86] toaster text alignment --- .../src/lib/components/toast/toast.component.html | 2 +- .../src/lib/components/toast/toast.component.scss | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html index bff6e7dee9..0e785a22bb 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html @@ -2,7 +2,7 @@
-
+
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss index 64bf8a6068..08b26c5184 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss @@ -79,3 +79,10 @@ $toastClass: abp-toast; } } } + +.toast-flex { + display: flex; + align-self: center; + word-break: break-word; + +} From 0d57c2896b31f0286695feb6f32e69855b94caf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Fri, 25 Nov 2022 12:18:09 +0300 Subject: [PATCH 03/86] formatted scss --- .../theme-shared/src/lib/components/toast/toast.component.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss index 08b26c5184..39ea573cde 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss @@ -84,5 +84,4 @@ $toastClass: abp-toast; display: flex; align-self: center; word-break: break-word; - } From afffee21f2a1629f13d36c19fdb81bf470491e68 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Fri, 25 Nov 2022 13:13:24 +0300 Subject: [PATCH 04/86] Remove isSameDataFunction --- .../personal-settings.component.ts | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts index 6ec15b1667..060cef712c 100644 --- a/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts +++ b/npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts @@ -36,7 +36,6 @@ export class PersonalSettingsComponent form: UntypedFormGroup; inProgress: boolean; - private profile: ProfileDto; constructor( private fb: UntypedFormBuilder, @@ -79,24 +78,12 @@ export class PersonalSettingsComponent }); } - isDataSame(oldValue, newValue) { - return Object.entries(oldValue).some(([key, value]) => { - if (key in newValue) { - return value !== newValue[key]; - } - return false; - }); - } - logoutConfirmation = () => { this.authService.logout().subscribe(); }; private isLogoutConfirmMessageActive() { - if (!this.isPersonalSettingsChangedConfirmationActive) { - return false; - } - return this.isDataSame(this.profile, this.form.value); + return this.isPersonalSettingsChangedConfirmationActive; } private showLogoutConfirmMessage() { From 0ad64465c54cbd23558a6bea6c5db72f106ce6fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Fri, 25 Nov 2022 13:50:21 +0300 Subject: [PATCH 05/86] delete toast-flex class --- .../src/lib/components/toast/toast.component.scss | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss index 39ea573cde..192af4afdb 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss @@ -47,6 +47,9 @@ $toastClass: abp-toast; } .#{$toastClass}-content { position: relative; + display: flex; + align-self: center; + word-break: break-word; .#{$toastClass}-close-button { position: absolute; top: 0; @@ -79,9 +82,3 @@ $toastClass: abp-toast; } } } - -.toast-flex { - display: flex; - align-self: center; - word-break: break-word; -} From e5d6164a57f84a26b80e0b037df635298307711b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20KILI=C3=87?= Date: Fri, 25 Nov 2022 15:30:25 +0300 Subject: [PATCH 06/86] delete toast-flex class --- .../theme-shared/src/lib/components/toast/toast.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html index 0e785a22bb..25db3a12e0 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.html @@ -2,7 +2,7 @@
-
+
From 0b2d727965f2fa0085ab820ccf5d7c18c79294bc Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 25 Nov 2022 18:26:22 +0300 Subject: [PATCH 07/86] Add Json-Column Article --- .../2022-11-25-JSON-columns/Database.png | Bin 0 -> 10172 bytes .../2022-11-25-JSON-columns/post.md | 98 ++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 docs/en/Community-Articles/2022-11-25-JSON-columns/Database.png create mode 100644 docs/en/Community-Articles/2022-11-25-JSON-columns/post.md diff --git a/docs/en/Community-Articles/2022-11-25-JSON-columns/Database.png b/docs/en/Community-Articles/2022-11-25-JSON-columns/Database.png new file mode 100644 index 0000000000000000000000000000000000000000..c8a5516aa6ed8bc9070ffa772a3645abe0b837a5 GIT binary patch literal 10172 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 Og83!uixubZJpMl&1{MDR literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md new file mode 100644 index 0000000000..f8dd2c4dec --- /dev/null +++ b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md @@ -0,0 +1,98 @@ +# The new EF Core JSON Columns + +## JSON Columns + +Most relational databases support columns that contain JSON documents. The JSON in these columns can be drilled into with queries. This allows, for example, filtering and sorting by the elements of the documents, as well as projection of elements out of the documents into results. JSON columns allow relational databases to take on some of the characteristics of document databases, creating a useful hybrid between the two. + +EF7 contains provider-agnostic support for JSON columns, with an implementation for SQL Server. This support allows mapping of aggregates built from .NET types to JSON documents. Normal LINQ queries can be used on the aggregates, and these will be translated to the appropriate query constructs needed to drill into the JSON. EF7 also supports updating and saving changes to the JSON documents. + +### Mapping JSON Columns AbpDbContext + +```csharp +public class ContactDetails +{ + public Address Address { get; set; } + public string? Phone { get; set; } +} + +public class Address +{ + public Address(string street, string city, string postcode, string country) + { + Street = street; + City = city; + Postcode = postcode; + Country = country; + } + + public string Street { get; set; } + public string City { get; set; } + public string Postcode { get; set; } + public string Country { get; set; } +} + +public class Person : AggregateRoot +{ + public string Name { get; set; } = null!; + public ContactDetails ContactDetails { get; set; } = null!; +} + +public class MyDbContext : AbpDbContext +{ + public DbSet Persons { get; set; } + + public MyDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + builder.Entity(b => + { + b.ToTable(abpEf7JsonColumnConsts.DbTablePrefix + "Persons", abpEf7JsonColumnConsts.DbSchema); + b.ConfigureByConvention(); + b.OwnsOne(x=>x.ContactDetails, c => + { + c.ToJson(); + c.OwnsOne(cd => cd.Address); + }); + }); + } +} +``` + +### Querying JSON Columns + +```csharp +var persons = await (await GetDbSetAsync()).ToListAsync(); + +var contacts = await (await GetDbSetAsync()).Select(person => new +{ + person, + person.ContactDetails.Phone, + Addresses = person.ContactDetails.Address +}).ToListAsync(); + +var addresses = await (await GetDbSetAsync()).Select(person => new +{ + person, + Addresses = person.ContactDetails.Address +}).ToListAsync(); +``` + +### Updating JSON Columns + +```csharp +var person = await (await GetDbSetAsync()).FirstAsync(); + +person.ContactDetails.Phone = "123456789"; +person.ContactDetails.Address = new Address("Street", "City", "Postcode", "Country"); +await UpdateAsync(person, true); +``` + +### Database View + +![image](./Database.png) From 0025cea715a413267e11bb38c4ad019f5b5413e2 Mon Sep 17 00:00:00 2001 From: malik masis Date: Fri, 25 Nov 2022 20:43:02 +0300 Subject: [PATCH 08/86] Added new parameters for repositories --- .../Abp/Identity/IIdentityUserRepository.cs | 18 ++++++++ .../EfCoreIdentityUserRepository.cs | 44 ++++++++++++++++-- .../MongoDB/MongoIdentityUserRepository.cs | 46 +++++++++++++++++-- 3 files changed, 99 insertions(+), 9 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs index 9729d03129..f026492f5a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs @@ -61,8 +61,17 @@ public interface IIdentityUserRepository : IBasicRepository string userName = null, string phoneNumber = null, string emailAddress = null, + string tenantName = null, + string name = null, + string surname = null, bool? isLockedOut = null, bool? notActive = null, + bool? emailConfirmed = null, + bool? isExternal = null, + DateTime? maxCreationTime = null, + DateTime? minCreationTime = null, + DateTime? maxModifitionTime = null, + DateTime? minModifitionTime = null, CancellationToken cancellationToken = default ); @@ -98,8 +107,17 @@ public interface IIdentityUserRepository : IBasicRepository string userName = null, string phoneNumber = null, string emailAddress = null, + string tenantName = null, + string name = null, + string surname = null, bool? isLockedOut = null, bool? notActive = null, + bool? emailConfirmed = null, + bool? isExternal = null, + DateTime? maxCreationTime = null, + DateTime? minCreationTime = null, + DateTime? maxModifitionTime = null, + DateTime? minModifitionTime = null, CancellationToken cancellationToken = default ); diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index ab9cc892d6..5c415aae10 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -142,8 +142,17 @@ public class EfCoreIdentityUserRepository : EfCoreRepository identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) @@ -164,6 +176,12 @@ public class EfCoreIdentityUserRepository : EfCoreRepository x.Email == emailAddress) .WhereIf(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) .WhereIf(notActive == true, x => !x.IsActive) + .WhereIf(emailConfirmed == true, x => !x.EmailConfirmed) + .WhereIf(isExternal == true, x => !x.IsExternal) + .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) + .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) + .WhereIf(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) + .WhereIf(minModifitionTime != null, p => p.LastModificationTime <= minModifitionTime) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(IdentityUser.UserName) : sorting) .PageBy(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); @@ -207,8 +225,17 @@ public class EfCoreIdentityUserRepository : EfCoreRepository identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) @@ -228,6 +258,12 @@ public class EfCoreIdentityUserRepository : EfCoreRepository x.Email == emailAddress) .WhereIf(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) .WhereIf(notActive == true, x => !x.IsActive) + .WhereIf(emailConfirmed == true, x => !x.EmailConfirmed) + .WhereIf(isExternal == true, x => !x.IsExternal) + .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) + .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) + .WhereIf(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) + .WhereIf(minModifitionTime != null, p => p.LastModificationTime <= minModifitionTime) .LongCountAsync(GetCancellationToken(cancellationToken)); } @@ -305,11 +341,11 @@ public class EfCoreIdentityUserRepository : EfCoreRepository FindByTenantIdAndUserNameAsync( [NotNull] string userName, - Guid? tenantId, + Guid? tenantId, bool includeDetails = true, CancellationToken cancellationToken = default) { - return await(await GetDbSetAsync()) + return await (await GetDbSetAsync()) .IncludeDetails(includeDetails) .FirstOrDefaultAsync( u => u.TenantId == tenantId && u.UserName == userName, diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index 71d0d2eb53..54731d56e4 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -143,8 +143,17 @@ public class MongoIdentityUserRepository : MongoDbRepository>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) @@ -164,6 +176,12 @@ public class MongoIdentityUserRepository : MongoDbRepository>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) .WhereIf>(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd > DateTimeOffset.UtcNow) .WhereIf>(notActive == true, x => !x.IsActive) + .WhereIf>(emailConfirmed == true, x => !x.EmailConfirmed) + .WhereIf>(isExternal == true, x => !x.IsExternal) + .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) + .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) + .WhereIf(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) + .WhereIf(minModifitionTime != null, p => p.LastModificationTime <= minModifitionTime) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(IdentityUser.UserName) : sorting) .As>() .PageBy>(skipCount, maxResultCount) @@ -211,8 +229,17 @@ public class MongoIdentityUserRepository : MongoDbRepository>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) @@ -232,6 +262,12 @@ public class MongoIdentityUserRepository : MongoDbRepository>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) .WhereIf>(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd > DateTimeOffset.UtcNow) .WhereIf>(notActive == true, x => !x.IsActive) + .WhereIf>(emailConfirmed == true, x => !x.EmailConfirmed) + .WhereIf>(isExternal == true, x => !x.IsExternal) + .WhereIf>(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) + .WhereIf>(minCreationTime != null, p => p.CreationTime >= minCreationTime) + .WhereIf>(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) + .WhereIf>(minModifitionTime != null, p => p.LastModificationTime <= minModifitionTime) .LongCountAsync(GetCancellationToken(cancellationToken)); } @@ -272,9 +308,9 @@ public class MongoIdentityUserRepository : MongoDbRepository FindByTenantIdAndUserNameAsync( - [NotNull] string userName, - Guid? tenantId, - bool includeDetails = true, + [NotNull] string userName, + Guid? tenantId, + bool includeDetails = true, CancellationToken cancellationToken = default) { return await (await GetMongoQueryableAsync(cancellationToken)) From 209f23b85e81b590523be10cb4d34c693cb4bf80 Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 25 Nov 2022 23:21:28 +0300 Subject: [PATCH 09/86] Update post.md --- .../2022-11-25-JSON-columns/post.md | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md index f8dd2c4dec..95a7754936 100644 --- a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md +++ b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md @@ -1,12 +1,23 @@ # The new EF Core JSON Columns +In this article, we will see how to use the new JSON columns in EF Core 7.0. + ## JSON Columns Most relational databases support columns that contain JSON documents. The JSON in these columns can be drilled into with queries. This allows, for example, filtering and sorting by the elements of the documents, as well as projection of elements out of the documents into results. JSON columns allow relational databases to take on some of the characteristics of document databases, creating a useful hybrid between the two. EF7 contains provider-agnostic support for JSON columns, with an implementation for SQL Server. This support allows mapping of aggregates built from .NET types to JSON documents. Normal LINQ queries can be used on the aggregates, and these will be translated to the appropriate query constructs needed to drill into the JSON. EF7 also supports updating and saving changes to the JSON documents. -### Mapping JSON Columns AbpDbContext +You can find more information about JSON columns in EF Core 7.0 in the [documentation](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns). + +### Mapping JSON Columns + +In EF Core, aggregate types are defined using `OwnsOne` and `OwnsMany`. +`OwnsOne` is used to map a single aggregate, and `OwnsMany` is used to map a collection of aggregates. + +`ToJson` is used to map a property to a JSON column. The property can be of any type that can be serialized to JSON. + +These aggregates can be mapped to JSON columns using the `ToJson` method. The following example shows how to map a JSON column to an aggregate type: ```csharp public class ContactDetails @@ -36,6 +47,11 @@ public class Person : AggregateRoot public string Name { get; set; } = null!; public ContactDetails ContactDetails { get; set; } = null!; } +``` + +Above, we have defined an aggregate type `ContactDetails` that contains an `Address` and a `Phone` number. The aggregate type is configured in `OnModelCreating` using `OwnsOne` and `ToJson`. The `Address` property is mapped to a JSON column using `ToJson`, and the `Phone` property is mapped to a regular column. This requires just one call to ToJson() when configuring the aggregate type: + +```csharp public class MyDbContext : AbpDbContext { @@ -52,7 +68,7 @@ public class MyDbContext : AbpDbContext builder.Entity(b => { - b.ToTable(abpEf7JsonColumnConsts.DbTablePrefix + "Persons", abpEf7JsonColumnConsts.DbSchema); + b.ToTable(MyProjectConsts.DbTablePrefix + "Persons", MyProjecConsts.DbSchema); b.ConfigureByConvention(); b.OwnsOne(x=>x.ContactDetails, c => { @@ -64,17 +80,28 @@ public class MyDbContext : AbpDbContext } ``` + + ### Querying JSON Columns +Queries into JSON columns work just the same as querying into any other aggregate type in EF Core. That is, just use LINQ! Here are some examples: + ```csharp var persons = await (await GetDbSetAsync()).ToListAsync(); +``` + +```csharp var contacts = await (await GetDbSetAsync()).Select(person => new { person, person.ContactDetails.Phone, Addresses = person.ContactDetails.Address }).ToListAsync(); +``` + + +```csharp var addresses = await (await GetDbSetAsync()).Select(person => new { @@ -85,6 +112,8 @@ var addresses = await (await GetDbSetAsync()).Select(person => new ### Updating JSON Columns +You can update JSON columns using the `Update` method. The following example shows how to update a JSON column: + ```csharp var person = await (await GetDbSetAsync()).FirstAsync(); @@ -96,3 +125,9 @@ await UpdateAsync(person, true); ### Database View ![image](./Database.png) + +### References + +[https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns) + +[https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities](https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities) \ No newline at end of file From a097bee1ff8dfaed1d52109734cedbca5d12abd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Muhammed=20Ali=20=C3=96ZKAYA?= Date: Sun, 27 Nov 2022 16:40:04 +0300 Subject: [PATCH 10/86] Community Article: gRPC - Health Checks --- .../2022-11-27-gRPC-Health-Checks/POST.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md diff --git a/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md b/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md new file mode 100644 index 0000000000..533be0c6f4 --- /dev/null +++ b/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md @@ -0,0 +1,69 @@ +# gRPC - Health Checks + +ASP.NET Core 7 supports gRPC health checks. In this article we will show how to use gRPC health checks with the ABP Framework. + +## Health Checks + +Health Checks allow us to determine the overall health and availability of our application infrastructure. They are exposed as HTTP endpoints and can be configured to provide information for various monitoring scenarios, such as the response time and memory usage of our application, or whether our application can communicate with our database provider. + +### gRPC Health Checks + +The [gRPC health checking protocol](https://github.com/grpc/grpc/blob/master/doc/health-checking.md) is a standard for reporting the health of gRPC server apps. An app exposes health checks as a gRPC service. They are typically used with an external monitoring service to check the status of an app. + +### Grpc.AspNetCore.HealthChecks + +ASP.NET Core supports the gRPC health checking protocol with the [Grpc.AspNetCore.HealthChecks](https://www.nuget.org/packages/Grpc.AspNetCore.HealthChecks) package. Results from .NET health checks are reported to callers. + +## Using gRPC Health Checks with the ABP Framework + +In this article, I'm assuming you've used gRPC with ABP before. If you are still having problems with this, it may be good for you to review this article. +https://community.abp.io/posts/using-grpc-with-the-abp-framework-2dgaxzw3 + +### Set up gRPC Health Checks + +In this solution, `*.HttpApi.Host` is the project that configures and runs the server-side application. So, we will make changes in that project. + +* Add the `Grpc.AspNetCore.HealthChecks` package to your project. + +```bash +dotnet add package Grpc.AspNetCore.HealthChecks +``` + +* `AddGrpcHealthChecks` to register services that enable health checks. + +```csharp +public override void ConfigureServices(ServiceConfigurationContext context) +{ + // Other configurations... + + context.Services.AddGrpcHealthChecks() + .AddCheck("SampleHealthCheck", () => HealthCheckResult.Healthy()); +} +``` +* `MapGrpcHealthChecksService` to add a health checks service endpoint. + +```csharp +public override void OnApplicationInitialization(ApplicationInitializationContext context) +{ + // Other middlewares... + + app.UseConfiguredEndpoints(builder => + { + builder.MapGrpcHealthChecksService(); + }); +} +``` + +### Calling Health Checks From a Client + +Now that our server is configured for gRPC health checks, we can test it by creating a basic console client. + +```csharp +var channel = GrpcChannel.ForAddress("https://localhost:44357"); +var client = new Health.HealthClient(channel); + +var response = await client.CheckAsync(new HealthCheckRequest()); +var status = response.Status; + +Console.WriteLine($"Health Status: {status}"); +``` \ No newline at end of file From 785e32a8e1b55d1389ac5eabb705f663c55d1312 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Sun, 27 Nov 2022 21:30:30 -0800 Subject: [PATCH 11/86] Closes #14601 --- .../Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs index e0817d8a45..7dceb70337 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs @@ -261,6 +261,12 @@ public class AbpIoSourceCodeStore : ISourceCodeStore, ITransientDependency } catch (Exception ex) { + if(ex is UserFriendlyException) + { + Logger.LogWarning(ex.Message); + throw; + } + Console.WriteLine("Error occured while downloading source-code from {0} : {1}{2}{3}", url, responseMessage?.ToString(), Environment.NewLine, ex.Message); throw; From 8cc91f205ff1d6d77a2140a2400a5dcf7c9050b8 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 28 Nov 2022 13:51:37 +0800 Subject: [PATCH 12/86] Add missing localization configuration --- .../AbpFeatureManagementBlazorModule.cs | 12 +++++++++++- .../AbpIdentityBlazorModule.cs | 14 +++++++++++++- .../AbpPermissionManagementBlazorModule.cs | 17 +++++++++++++++-- .../AbpSettingManagementBlazorModule.cs | 14 +++++++++++++- .../AbpTenantManagementBlazorModule.cs | 15 ++++++++++++++- 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/AbpFeatureManagementBlazorModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/AbpFeatureManagementBlazorModule.cs index 87882015fc..0e3969fccd 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/AbpFeatureManagementBlazorModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/AbpFeatureManagementBlazorModule.cs @@ -1,6 +1,9 @@ -using Volo.Abp.AspNetCore.Components.Web.Theming; +using Localization.Resources.AbpUi; +using Volo.Abp.AspNetCore.Components.Web.Theming; using Volo.Abp.FeatureManagement.Blazor.Settings; +using Volo.Abp.FeatureManagement.Localization; using Volo.Abp.Features; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.SettingManagement.Blazor; @@ -20,5 +23,12 @@ public class AbpFeatureManagementBlazorModule : AbpModule { options.Contributors.Add(new FeatureSettingManagementComponentContributor()); }); + + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes(typeof(AbpUiResource)); + }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityBlazorModule.cs b/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityBlazorModule.cs index 4b9dc5326f..3367b42a1b 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityBlazorModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityBlazorModule.cs @@ -1,7 +1,10 @@ -using Microsoft.Extensions.DependencyInjection; +using Localization.Resources.AbpUi; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; using Volo.Abp.AutoMapper; using Volo.Abp.BlazoriseUI; +using Volo.Abp.Identity.Localization; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending.Modularity; @@ -39,6 +42,15 @@ public class AbpIdentityBlazorModule : AbpModule { options.AdditionalAssemblies.Add(typeof(AbpIdentityBlazorModule).Assembly); }); + + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes( + typeof(AbpUiResource) + ); + }); } public override void PostConfigureServices(ServiceConfigurationContext context) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/AbpPermissionManagementBlazorModule.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/AbpPermissionManagementBlazorModule.cs index fbcb7f26a1..1e7e69d4c3 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/AbpPermissionManagementBlazorModule.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/AbpPermissionManagementBlazorModule.cs @@ -1,6 +1,9 @@ -using Volo.Abp.AspNetCore.Components.Web.Theming; +using Localization.Resources.AbpUi; +using Volo.Abp.AspNetCore.Components.Web.Theming; using Volo.Abp.AutoMapper; +using Volo.Abp.Localization; using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement.Localization; namespace Volo.Abp.PermissionManagement.Blazor; @@ -11,5 +14,15 @@ namespace Volo.Abp.PermissionManagement.Blazor; )] public class AbpPermissionManagementBlazorModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes( + typeof(AbpUiResource) + ); + }); + } } diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/AbpSettingManagementBlazorModule.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/AbpSettingManagementBlazorModule.cs index 8888df3596..533e272198 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/AbpSettingManagementBlazorModule.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/AbpSettingManagementBlazorModule.cs @@ -1,10 +1,13 @@ -using Microsoft.Extensions.DependencyInjection; +using Localization.Resources.AbpUi; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Components.Web.Theming; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; using Volo.Abp.AutoMapper; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.SettingManagement.Blazor.Menus; using Volo.Abp.SettingManagement.Blazor.Settings; +using Volo.Abp.SettingManagement.Localization; using Volo.Abp.UI.Navigation; namespace Volo.Abp.SettingManagement.Blazor; @@ -39,5 +42,14 @@ public class AbpSettingManagementBlazorModule : AbpModule { options.Contributors.Add(new EmailingPageContributor()); }); + + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes( + typeof(AbpUiResource) + ); + }); } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/AbpTenantManagementBlazorModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/AbpTenantManagementBlazorModule.cs index 0296e377bb..0433f2e33b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/AbpTenantManagementBlazorModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/AbpTenantManagementBlazorModule.cs @@ -1,11 +1,15 @@ -using Microsoft.Extensions.DependencyInjection; +using Localization.Resources.AbpUi; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; using Volo.Abp.AutoMapper; using Volo.Abp.FeatureManagement.Blazor; +using Volo.Abp.FeatureManagement.Localization; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending.Modularity; using Volo.Abp.TenantManagement.Blazor.Navigation; +using Volo.Abp.TenantManagement.Localization; using Volo.Abp.Threading; using Volo.Abp.UI.Navigation; @@ -38,6 +42,15 @@ public class AbpTenantManagementBlazorModule : AbpModule { options.AdditionalAssemblies.Add(typeof(AbpTenantManagementBlazorModule).Assembly); }); + + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes( + typeof(AbpFeatureManagementResource), + typeof(AbpUiResource)); + }); } public override void PostConfigureServices(ServiceConfigurationContext context) From 36d06faa77e0c73988d6a008339fea71fb243e7d Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:32:22 -0800 Subject: [PATCH 13/86] Update post.md --- .../2022-11-25-JSON-columns/post.md | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md index 95a7754936..cb8ceafc88 100644 --- a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md +++ b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md @@ -1,23 +1,22 @@ -# The new EF Core JSON Columns +# JSON Columns in Entity Framework Core 7 -In this article, we will see how to use the new JSON columns in EF Core 7.0. +In this article, we will see how to use the new **JSON Columns** features that came with EF Core 7 in an ABP based application (with examples). ## JSON Columns -Most relational databases support columns that contain JSON documents. The JSON in these columns can be drilled into with queries. This allows, for example, filtering and sorting by the elements of the documents, as well as projection of elements out of the documents into results. JSON columns allow relational databases to take on some of the characteristics of document databases, creating a useful hybrid between the two. +Most relational databases support columns that contain JSON documents. The JSON in these columns can be drilled into with queries. This allows, for example, filtering and sorting by the elements of the documents, as well as projection of elements out of the documents into results. JSON columns allow relational databases to take on some of the characteristics of document databases, creating a useful hybrid between these two database management approaches. -EF7 contains provider-agnostic support for JSON columns, with an implementation for SQL Server. This support allows mapping of aggregates built from .NET types to JSON documents. Normal LINQ queries can be used on the aggregates, and these will be translated to the appropriate query constructs needed to drill into the JSON. EF7 also supports updating and saving changes to the JSON documents. +EF7 contains provider-agnostic support for JSON columns, with an implementation for SQL Server. This support allows the mapping of aggregates built from .NET types to JSON documents. Normal LINQ queries can be used on the aggregates, and these will be translated to the appropriate query constructs needed to drill into the JSON. EF7 also supports updating and saving changes to JSON documents. -You can find more information about JSON columns in EF Core 7.0 in the [documentation](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns). +> You can find more information about JSON columns in EF Core's [documentation](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns). ### Mapping JSON Columns -In EF Core, aggregate types are defined using `OwnsOne` and `OwnsMany`. -`OwnsOne` is used to map a single aggregate, and `OwnsMany` is used to map a collection of aggregates. +In EF Core, aggregate types can be defined using `OwnsOne` and `OwnsMany` methods. `OwnsOne` can be used to map a single aggregate and the `OwnsMany` method can be used to map a collection of aggregates. -`ToJson` is used to map a property to a JSON column. The property can be of any type that can be serialized to JSON. +With EF 7, we have a new extension method for mapping property to a JSON Column: `ToJson`. We can use this method to mark a property as a JSON Column. The property can be of any type that can be serialized to JSON. -These aggregates can be mapped to JSON columns using the `ToJson` method. The following example shows how to map a JSON column to an aggregate type: +The following example shows how to map a JSON column to an aggregate type: ```csharp public class ContactDetails @@ -49,7 +48,8 @@ public class Person : AggregateRoot } ``` -Above, we have defined an aggregate type `ContactDetails` that contains an `Address` and a `Phone` number. The aggregate type is configured in `OnModelCreating` using `OwnsOne` and `ToJson`. The `Address` property is mapped to a JSON column using `ToJson`, and the `Phone` property is mapped to a regular column. This requires just one call to ToJson() when configuring the aggregate type: +* Above, we have defined an aggregate type `ContactDetails` that contains an `Address` and a `Phone` number. The aggregate type is configured in `OnModelCreating` using `OwnsOne` and `ToJson` methods below. +* The `Address` property is mapped to a JSON column using `ToJson`, and the `Phone` property is mapped to a regular column. This requires just one call to **ToJson()** when configuring the aggregate type: ```csharp @@ -72,7 +72,7 @@ public class MyDbContext : AbpDbContext b.ConfigureByConvention(); b.OwnsOne(x=>x.ContactDetails, c => { - c.ToJson(); + c.ToJson(); //mark as JSON Column c.OwnsOne(cd => cd.Address); }); }); @@ -80,39 +80,30 @@ public class MyDbContext : AbpDbContext } ``` - - ### Querying JSON Columns -Queries into JSON columns work just the same as querying into any other aggregate type in EF Core. That is, just use LINQ! Here are some examples: +Queries into JSON columns work just the same as querying into any other aggregate type in EF Core. That's it, just use the LINQ! Here are some examples: ```csharp var persons = await (await GetDbSetAsync()).ToListAsync(); -``` - -```csharp var contacts = await (await GetDbSetAsync()).Select(person => new { person, - person.ContactDetails.Phone, - Addresses = person.ContactDetails.Address + person.ContactDetails.Phone, //query over JSON column + Addresses = person.ContactDetails.Address //query over JSON column }).ToListAsync(); -``` - - -```csharp var addresses = await (await GetDbSetAsync()).Select(person => new { person, - Addresses = person.ContactDetails.Address + Addresses = person.ContactDetails.Address //query over JSON column }).ToListAsync(); ``` ### Updating JSON Columns -You can update JSON columns using the `Update` method. The following example shows how to update a JSON column: +You can update JSON columns the same as updating any record by using the `UpdateAsync` method. The following example shows how to update a JSON column: ```csharp var person = await (await GetDbSetAsync()).FirstAsync(); @@ -122,12 +113,19 @@ person.ContactDetails.Address = new Address("Street", "City", "Postcode", "Count await UpdateAsync(person, true); ``` -### Database View +### JSON Column in a Database + +After you've configured the database relations, created a new migration and applied it to database you will have a database table like below: ![image](./Database.png) -### References +As you can see, thanks to JSON Columns feature the **ContactDetails** row has JSON content and we can use it in a query or update it from our application with the LINQ JSON query support that mentioned above. -[https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns) +### Conclusion + +In this article, I've briefly introduced the JSON Columns feature that was shipped with EF Core 7. It's pretty straightforward to use JSON Columns in an ABP based application. You can see the examples above and give it a try! + +### References -[https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities](https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities) \ No newline at end of file +* [https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns) +* [https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities](https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities) \ No newline at end of file From 8c3069f13b532769571dc925a99554902f38c61b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Muhammed=20Ali=20=C3=96ZKAYA?= Date: Mon, 28 Nov 2022 10:50:45 +0300 Subject: [PATCH 14/86] Add references section --- .../2022-11-27-gRPC-Health-Checks/POST.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md b/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md index 533be0c6f4..ce2ed939ac 100644 --- a/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md +++ b/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md @@ -1,10 +1,10 @@ # gRPC - Health Checks -ASP.NET Core 7 supports gRPC health checks. In this article we will show how to use gRPC health checks with the ABP Framework. +In this article we will show how to use gRPC health checks with the ABP Framework. ## Health Checks -Health Checks allow us to determine the overall health and availability of our application infrastructure. They are exposed as HTTP endpoints and can be configured to provide information for various monitoring scenarios, such as the response time and memory usage of our application, or whether our application can communicate with our database provider. +ASP.NET Core 7 supports gRPC health checks. Health Checks allow us to determine the overall health and availability of our application infrastructure. They are exposed as HTTP endpoints and can be configured to provide information for various monitoring scenarios, such as the response time and memory usage of our application, or whether our application can communicate with our database provider. ### gRPC Health Checks @@ -66,4 +66,8 @@ var response = await client.CheckAsync(new HealthCheckRequest()); var status = response.Status; Console.WriteLine($"Health Status: {status}"); -``` \ No newline at end of file +``` + +## References + +- https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-7.0?view=aspnetcore-7.0#grpc-health-checks-in-aspnet-core \ No newline at end of file From 98afc31ef2f85789b7a4b9b4103c65642f8cb51e Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 28 Nov 2022 15:56:47 +0800 Subject: [PATCH 15/86] Upgrade to Blazorise 1.1.4.1 --- .../src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj | 8 ++++---- ...MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Server.csproj | 4 ++-- ...yCompanyName.MyProjectName.Blazor.Server.Tiered.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Server.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor/wwwroot/index.html | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Host.csproj | 4 ++-- .../wwwroot/index.html | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Server.Host.csproj | 4 ++-- 10 files changed, 22 insertions(+), 22 deletions(-) diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj index 4a1a8789f9..d45892bccb 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj +++ b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj @@ -14,10 +14,10 @@ - - - - + + + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj index 22d4f51fbf..0983f7740c 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index c840b24cbb..8573e93e48 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj index 0573ce737f..832bd8d7ba 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index e1c5a68a56..eb34741aa4 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 923d27c148..53338ee686 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html index 5a6bb01acf..86839294ad 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html @@ -8,7 +8,7 @@ - + @@ -29,7 +29,7 @@
- + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj index 04772fc8e8..5177f6af11 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/index.html b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/index.html index 1c7a8ec1ae..0ba799d6a9 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/index.html +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/wwwroot/index.html @@ -8,7 +8,7 @@ - + @@ -22,7 +22,7 @@
- + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj index 4cb1ef18df..4557540843 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj @@ -12,8 +12,8 @@ - - + + From aff68835b048b7f7b02c09998d9dd69db71ab718 Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:57:27 +0300 Subject: [PATCH 16/86] tiny fix --- .../Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md b/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md index ce2ed939ac..70bcb15e38 100644 --- a/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md +++ b/docs/en/Community-Articles/2022-11-27-gRPC-Health-Checks/POST.md @@ -40,7 +40,7 @@ public override void ConfigureServices(ServiceConfigurationContext context) .AddCheck("SampleHealthCheck", () => HealthCheckResult.Healthy()); } ``` -* `MapGrpcHealthChecksService` to add a health checks service endpoint. +* `MapGrpcHealthChecksService` to add a health check service endpoint. ```csharp public override void OnApplicationInitialization(ApplicationInitializationContext context) @@ -70,4 +70,4 @@ Console.WriteLine($"Health Status: {status}"); ## References -- https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-7.0?view=aspnetcore-7.0#grpc-health-checks-in-aspnet-core \ No newline at end of file +- https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-7.0?view=aspnetcore-7.0#grpc-health-checks-in-aspnet-core From 570fcdd4824350686b42b9995c1be6994c14b544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 28 Nov 2022 12:24:18 +0300 Subject: [PATCH 17/86] Add new article --- .../POST.md | 372 ++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md diff --git a/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md b/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md new file mode 100644 index 0000000000..e9f734825a --- /dev/null +++ b/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md @@ -0,0 +1,372 @@ +# Injecting Service Dependencies to Entities with Entity Framework Core 7.0 + +[Dependency injection](https://docs.abp.io/en/abp/latest/Dependency-Injection) is a widely-used pattern of obtaining references to other services from our classes. It is a built-in feature when you develop ASP.NET Core applications. In this article, I will explain why we may need to have references to other services in an entity class and how we can implement Entity Framework Core's new `IMaterializationInterceptor` interface to provide these services to the entities using the standard dependency injection system. + +## The Problem + +While developing applications based on [Domain-Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design) (DDD) patterns, we typically write our business code inside [application services](https://docs.abp.io/en/abp/latest/Application-Services), [domain services](https://docs.abp.io/en/abp/latest/Domain-Services) and [entities](https://docs.abp.io/en/abp/latest/Entities). Since the application and domain service instances are created by the dependency injection system, they can inject services into their constructors. + +Here, an example domain service that injects a repository into its constructor: + +````csharp +public class ProductManager : DomainService +{ + private readonly IRepository _productRepository; + + public ProductManager(IRepository productRepository) + { + _productRepository = productRepository; + } + + //... +} +```` + +`ProductManager` can then use the `_productRepository` object in its methods to perform its business logic. In the following example, `ChangeCodeAsync` method is used to change a product's code (the `ProductCode` property) by ensuring uniqueness of product codes in the system: + +````csharp +public class ProductManager : DomainService +{ + private readonly IRepository _productRepository; + + public ProductManager(IRepository productRepository) + { + _productRepository = productRepository; + } + + public async Task ChangeCodeAsync(Product product, string newProductCode) + { + Check.NotNull(product, nameof(product)); + Check.NotNullOrWhiteSpace(newProductCode, nameof(newProductCode)); + + if (product.ProductCode == newProductCode) + { + return; + } + + if (await _productRepository.AnyAsync(x => x.ProductCode == newProductCode)) + { + throw new ApplicationException( + "Product code is already used: " + newProductCode); + } + + product.ProductCode = newProductCode; + } +} +```` + +Here, the `ProductManager` forces the rule "product code must be unique". Let's see the `Product` entity class too: + +````csharp +public class Product : AuditedAggregateRoot +{ + public string ProductCode { get; internal set; } + + public string Name { get; private set; } + + private Product() + { + /* This constructor is used by EF Core while + getting the Product from database */ + } + + /* Primary constructor that should be used in the application code */ + public Product(string productCode, string name) + { + ProductCode = Check.NotNullOrWhiteSpace(productCode, nameof(productCode)); + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + } +} +```` + +You see that the `ProductCode` property's setter is `internal`, which makes possible to set it from the `ProductManager` class as shown before. + +This design has a problem: We had to make the `ProductCode` setter `internal`. Now, any developer may forget to use the `ProductManager.ChangeCodeAsync` method, and can directly set the `ProductCode` on the entity. So, we can't completely force the "product code must be unique" rule. + +It would be better to move the `ChangeCodeAsync` method into the `Product` class and make the `ProductCode` property's setter `private`: + +````csharp +public class Product : AuditedAggregateRoot +{ + public string ProductCode { get; private set; } + + public string Name { get; private set; } + + // ... + + public async Task ChangeCodeAsync(string newProductCode) + { + Check.NotNullOrWhiteSpace(newProductCode, nameof(newProductCode)); + + if (newProductCode == ProductCode) + { + return; + } + + /* ??? HOW TO INJECT THE PRODUCT REPOSITORY HERE ??? */ + if (await _productRepository.AnyAsync(x => x.ProductCode == newProductCode)) + { + throw new ApplicationException("Product code is already used: " + newProductCode); + } + + ProductCode = newProductCode; + } +} +```` + +With that design, there is no way to set the `ProductCode` without applying the rule "product code must be unique". Great! But we have a problem: An entity class can not inject dependencies into its constructor, because an entity is not created using the dependency injection system. There are two common points of creating an entity: + +* We can create an entity in our application code, using the standard `new` keyword, like `var product = new Product(...);`. +* Entity Framework (and any other ORM / database provider) creates entities after getting them from the database. They typically use the empty (default) constructor of the entity to create it, then sets the properties coming from the database query. + +So, how we can use the product repository in the `Product.ChangeCodeAsync` method? If we forget the dependency injection system, we would think to add the repository as a parameter to the `ChangeCodeAsync` method and delegate the responsibility of obtaining the service reference to the caller of that method: + +````csharp +public async Task ChangeCodeAsync( + IRepository productRepository, string newProductCode) +{ + Check.NotNull(productRepository, nameof(productRepository)); + Check.NotNullOrWhiteSpace(newProductCode, nameof(newProductCode)); + + if (newProductCode == ProductCode) + { + return; + } + + if (await productRepository.AnyAsync(x => x.ProductCode == newProductCode)) + { + throw new ApplicationException( + "Product code is already used: " + newProductCode); + } + + ProductCode = newProductCode; +} +```` + +However, that design would make hard to use the `ChangeCodeAsync` method, and also exposes its internal dependencies to outside. If we need another dependency in the `ChangeCodeAsync` method later, we should add another parameter, which will effect all the application code that uses the `ChangeCodeAsync` method. I think that's not reasonable. The next section offers a better and a more generic solution to the problem. + +## The Solution + +First of all, we can introduce an interface that should be implemented by the entity classes which needs to use services in their methods: + +````csharp +public interface IInjectServiceProvider +{ + ICachedServiceProvider ServiceProvider { get; set; } +} +```` + +`ICachedServiceProvider` is a service that is provided by the ABP Framework. It extends the standard `IServiceProvider`, but caches the resolved services. Basically, it internally resolves a service only a single time, even if you resolve the service from it multiple times. The `ICachedServiceProvider` service itself is a scoped service, means it is created only once in a scope. We can use it to optimize the service resolution, however, the standard `IServiceProvider` would work as expected. + +Next, we can implement the `IInjectServiceProvider` for our `Product` entity: + +````csharp +public class Product : AuditedAggregateRoot, IInjectServiceProvider +{ + public ICachedServiceProvider ServiceProvider { get; set; } + + //... +} +```` + +I will explain how to set the `ServiceProvider` property later, but first see how to use it in our `Product.ChangeCodeAsync` method. Here, the final `Product` class: + +````csharp +public class Product : AuditedAggregateRoot, IInjectServiceProvider +{ + public string ProductCode { get; internal set; } + + public string Name { get; private set; } + + public ICachedServiceProvider ServiceProvider { get; set; } + + private Product() + { + /* This constructor is used by EF Core while + getting the Product from database */ + } + + /* Primary constructor that should be used in the application code */ + public Product(string productCode, string name) + { + ProductCode = Check.NotNullOrWhiteSpace(productCode, nameof(productCode)); + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + } + + public async Task ChangeCodeAsync(string newProductCode) + { + Check.NotNullOrWhiteSpace(newProductCode, nameof(newProductCode)); + + if (newProductCode == ProductCode) + { + return; + } + + var productRepository = ServiceProvider + .GetRequiredService>(); + + if (await productRepository.AnyAsync(x => x.ProductCode == newProductCode)) + { + throw new ApplicationException("Product code is already used: " + newProductCode); + } + + ProductCode = newProductCode; + } +} +```` + +The `ChangeCodeAsync` method gets the product repository from the `ServiceProvider` and uses it to check if there is another product with the given `newProductCode` value. + +Now, let's explain how to set the `ServiceProvider` value... + +### Entity Framework Core Configuration + +Entity Framework 7.0 introduces the `IMaterializationInterceptor` interceptor that allows us to manipulate an entity object just after the entity object is created as a result of database query. + +We can write the following interceptor that sets the `ServiceProvider` property of an entity, if it implements the `IInjectServiceProvider` interface: + +````csharp +public class ServiceProviderInterceptor : IMaterializationInterceptor +{ + public object InitializedInstance( + MaterializationInterceptionData materializationData, + object instance) + { + if (instance is IInjectServiceProvider entity) + { + entity.ServiceProvider = materializationData + .Context + .GetService(); + } + + return instance; + } +} +```` + +> Lifetime of the resolved services are tied to the lifetime of the related `DbContext` instance. So, you don't need to care if the resolved dependencies are disposed. ABP's [unit of work](https://docs.abp.io/en/abp/latest/Unit-Of-Work) system already disposes the `DbContext` instance when the unit of work completed. + +Once we defined such an interceptor, we should configure our `DbContext` class to use it. You can do it by overriding the `OnConfiguring` method in your `DbContext` class: + +````csharp +protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) +{ + base.OnConfiguring(optionsBuilder); + optionsBuilder.AddInterceptors(new ServiceProviderInterceptor()); +} +```` + +Finally, you should ignore the `ServiceProvider` property in your entity mapping configuration in your `DbContext`: + +````csharp +protected override void OnModelCreating(ModelBuilder builder) +{ + base.OnModelCreating(builder); + // ... + builder.Entity(b => + { + // ... + /* We should ignore the ServiceProvider on mapping! */ + b.Ignore(x => x.ServiceProvider); + }); +} +```` + +That's all. From now, EF Core will set the `ServiceProvider` property for you. + +### Manually Creating Entities + +While EF Core seamlessly set the `ServiceProvider` property while getting entities from database, you should still set it manually while creating new entities yourself. + +**Example: Set `ServiceProvider` property while creating a new Product entity:** + +````csharp +public async Task CreateAsync(CreateProductDto input) +{ + var product = new Product(input.ProductCode, input.Name) + { + ServiceProvider = _cachedServiceProvider + }; + + await _productRepository.InsertAsync(product); +} +```` + +Here, you may think that it is not necessary to set the `ServiceProvider` here, because we haven't used the `ChangeCodeAsync` method. You are definitely right; It is not needed in this example, because it is clear to see there is no action between the entity creation and saving it to the database. However, if you call a method of the entity, or pass it to another service before inserting into the database, you may not know if the `ServiceProvider` will be needed before saving it. So, you should carefully use it. + +Basically, I've introduced the problem and the solution. In the next section, I will explain some limitations of that design and some of my other thoughts. + +## Discussions & Alternatives + +### Why injected a service provider, but not the services? + +As an obvious question, you may ask why we've property-injected a service provider object, then resolved the services manually. Can't we directly property-inject our dependencies? + +**Example: Property-inject the `IRepository` service:** + +````csharp +public class Product : AuditedAggregateRoot +{ + // ... + + public IRepository ProductRepository { get; set; } + + public async Task ChangeCodeAsync(string newProductCode) + { + Check.NotNullOrWhiteSpace(newProductCode, nameof(newProductCode)); + + if (newProductCode == ProductCode) + { + return; + } + + if (await ProductRepository.AnyAsync(x => x.ProductCode == newProductCode)) + { + throw new ApplicationException("Product code is already used: " + newProductCode); + } + + ProductCode = newProductCode; + } +} +```` + +Now, we don't need to implement the `IInjectServiceProvider` interface, and manually resolve the `IRepository` object from the `ServiceProvider`. You see that the `ChangeCodeAsync` method is much simpler now. + +So, how to set `ProductRepository`? For the EF Core interceptor part, you can somehow get all public properties of the entity via reflection, for each property, check if such a service does exist, and set it from the dependency injection system if available. That will have less performant, but would work. On the other hand, it would be extra hard to set all dependencies of the entity while manually creating it using the `new` keyword. So, personally I wouldn't recommend that. + +### Limitations + +One important limitation is that you can not use the services inside your entity's constructor code. Ideally, the constructor of the `Product` class should check if the product code is already used before. See the following constructor: + +````csharp +public Product(string productCode, string name) +{ + ProductCode = Check.NotNullOrWhiteSpace(productCode, nameof(productCode)); + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + + /* Can not check if product code is already used by another product? */ +} +```` + +It is not possible to use the product repository here, because; + +1. The services are property-injected. That means they will be set after the object creation has completed. +2. Even if the service is available, it won't be truly possible to call async code in a constructor. You know constructors can not be async in C#, but the repository and other service methods are generally designed as async. + +So, if you want to force the "product code must be unique" rule, you should create an async domain service method (like `ProductManager.CreateAsync(...)`) and always use it to create products (you can make the `Product` class constructor `internal` to not allow to use it in the application layer). + +### Design Problems + +Beside the technical limitations, coupling your entities to external services is generally considered as a bad design. It makes your entities over-complicated, hard to test, and generally leads to take too much responsibility over the time. + +## Conclusion + +In this article, I tried to investigate all aspects of injecting services into entity classes. I explained how to use Entity Framework 7.0 `IMaterializationInterceptor` to implement property-injection pattern while getting entities from database. + +Injecting services into entities seems a certain way of forcing some business rules in your entities. However, because of the current technical limitations, design issues and usage difficulties, I don't suggest to depend on services in your entities. Instead, create domain services when you need to implement a business rule that depends on external services and entities. + +## See Also + +* [What's new in EF Core 7.0](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew) +* [ABP Framework: Dependency Injection](https://docs.abp.io/en/abp/latest/Dependency-Injection) +* [ABP Framework: Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design) \ No newline at end of file From 49cb3567122ea28ad8740f79759ce1dcc8a3337a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 28 Nov 2022 12:33:59 +0300 Subject: [PATCH 18/86] Update POST.md --- .../POST.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md b/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md index e9f734825a..2759bfed16 100644 --- a/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md +++ b/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md @@ -244,7 +244,7 @@ public class ServiceProviderInterceptor : IMaterializationInterceptor } ```` -> Lifetime of the resolved services are tied to the lifetime of the related `DbContext` instance. So, you don't need to care if the resolved dependencies are disposed. ABP's [unit of work](https://docs.abp.io/en/abp/latest/Unit-Of-Work) system already disposes the `DbContext` instance when the unit of work completed. +> Lifetime of the resolved services are tied to the lifetime of the related `DbContext` instance. So, you don't need to care if the resolved dependencies are disposed. ABP's [unit of work](https://docs.abp.io/en/abp/latest/Unit-Of-Work) system already disposes the `DbContext` instance when the unit of work is completed. Once we defined such an interceptor, we should configure our `DbContext` class to use it. You can do it by overriding the `OnConfiguring` method in your `DbContext` class: @@ -256,7 +256,7 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) } ```` -Finally, you should ignore the `ServiceProvider` property in your entity mapping configuration in your `DbContext`: +Finally, you should ignore the `ServiceProvider` property in your entity mapping configuration in your `DbContext` (because we don't want to map it to a database table field): ````csharp protected override void OnModelCreating(ModelBuilder builder) @@ -292,11 +292,13 @@ public async Task CreateAsync(CreateProductDto input) } ```` -Here, you may think that it is not necessary to set the `ServiceProvider` here, because we haven't used the `ChangeCodeAsync` method. You are definitely right; It is not needed in this example, because it is clear to see there is no action between the entity creation and saving it to the database. However, if you call a method of the entity, or pass it to another service before inserting into the database, you may not know if the `ServiceProvider` will be needed before saving it. So, you should carefully use it. +Here, you may think that it is not necessary to set the `ServiceProvider`, because we haven't used the `ChangeCodeAsync` method. You are definitely right; It is not needed in this example, because it is clear to see the entity object is not used between the entity creation and saving it to the database. However, if you call a method of the entity, or pass it to another service before inserting into the database, you may not know if the `ServiceProvider` will be needed. So, you should carefully use it. Basically, I've introduced the problem and the solution. In the next section, I will explain some limitations of that design and some of my other thoughts. -## Discussions & Alternatives +## Discussions + +In this section, I will first discuss a slightly different way of obtaining services. Then I will explain limitations and problems of injecting services into entities. ### Why injected a service provider, but not the services? @@ -330,9 +332,9 @@ public class Product : AuditedAggregateRoot } ```` -Now, we don't need to implement the `IInjectServiceProvider` interface, and manually resolve the `IRepository` object from the `ServiceProvider`. You see that the `ChangeCodeAsync` method is much simpler now. +Now, we don't need to implement the `IInjectServiceProvider` interface and manually resolve the `IRepository` object from the `ServiceProvider`. You see that the `ChangeCodeAsync` method is much simpler now. -So, how to set `ProductRepository`? For the EF Core interceptor part, you can somehow get all public properties of the entity via reflection, for each property, check if such a service does exist, and set it from the dependency injection system if available. That will have less performant, but would work. On the other hand, it would be extra hard to set all dependencies of the entity while manually creating it using the `new` keyword. So, personally I wouldn't recommend that. +So, how to set `ProductRepository`? For the EF Core interceptor part, you can somehow get all public properties of the entity via reflection. Then, for each property, check if such a service does exist, and set it from the dependency injection system if available. Surely, that will be less performant, but will work if you can truly implement. On the other hand, it would be extra hard to set all the dependencies of the entity while manually creating it using the `new` keyword. So, personally I wouldn't recommend that approach. ### Limitations From 7dd714edb2e5ce3ed23256a9eb3ee7798486e3c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 28 Nov 2022 13:35:38 +0300 Subject: [PATCH 19/86] Add source code link --- .../2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md b/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md index 2759bfed16..8ed92d43c2 100644 --- a/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md +++ b/docs/en/Community-Articles/2022-11-28-EF-Core-Entity-Dependency-Injection/POST.md @@ -2,6 +2,8 @@ [Dependency injection](https://docs.abp.io/en/abp/latest/Dependency-Injection) is a widely-used pattern of obtaining references to other services from our classes. It is a built-in feature when you develop ASP.NET Core applications. In this article, I will explain why we may need to have references to other services in an entity class and how we can implement Entity Framework Core's new `IMaterializationInterceptor` interface to provide these services to the entities using the standard dependency injection system. +> You can find the source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreEntityDependencyInjectionDemo). + ## The Problem While developing applications based on [Domain-Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design) (DDD) patterns, we typically write our business code inside [application services](https://docs.abp.io/en/abp/latest/Application-Services), [domain services](https://docs.abp.io/en/abp/latest/Domain-Services) and [entities](https://docs.abp.io/en/abp/latest/Entities). Since the application and domain service instances are created by the dependency injection system, they can inject services into their constructors. @@ -367,6 +369,11 @@ In this article, I tried to investigate all aspects of injecting services into e Injecting services into entities seems a certain way of forcing some business rules in your entities. However, because of the current technical limitations, design issues and usage difficulties, I don't suggest to depend on services in your entities. Instead, create domain services when you need to implement a business rule that depends on external services and entities. +## The Source Code + +* You can find the full source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreEntityDependencyInjectionDemo). +* You can see [this pull request](https://github.com/abpframework/abp-samples/pull/207/files) for the changes I've done after creating the application. + ## See Also * [What's new in EF Core 7.0](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew) From a5dbce8d693027fe53662ec338e2ba8efa27c756 Mon Sep 17 00:00:00 2001 From: malik masis Date: Mon, 28 Nov 2022 13:49:44 +0300 Subject: [PATCH 20/86] Used tenantId instead of tenantName --- .../Abp/Identity/IIdentityUserRepository.cs | 4 +-- .../EfCoreIdentityUserRepository.cs | 28 +++++++++---------- .../MongoDB/MongoIdentityUserRepository.cs | 28 +++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs index f026492f5a..f6b2550e9f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs @@ -58,10 +58,10 @@ public interface IIdentityUserRepository : IBasicRepository bool includeDetails = false, Guid? roleId = null, Guid? organizationUnitId = null, + Guid? tenantId = null, string userName = null, string phoneNumber = null, string emailAddress = null, - string tenantName = null, string name = null, string surname = null, bool? isLockedOut = null, @@ -104,10 +104,10 @@ public interface IIdentityUserRepository : IBasicRepository string filter = null, Guid? roleId = null, Guid? organizationUnitId = null, + Guid? tenantId = null, string userName = null, string phoneNumber = null, string emailAddress = null, - string tenantName = null, string name = null, string surname = null, bool? isLockedOut = null, diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index 5c415aae10..c311397e1e 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -139,10 +139,10 @@ public class EfCoreIdentityUserRepository : EfCoreRepository identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) + .WhereIf(tenantId.HasValue, identityUser => identityUser.TenantId == tenantId) .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) + .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name == name) + .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) .WhereIf(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) .WhereIf(notActive == true, x => !x.IsActive) - .WhereIf(emailConfirmed == true, x => !x.EmailConfirmed) - .WhereIf(isExternal == true, x => !x.IsExternal) + .WhereIf(emailConfirmed == true, x => x.EmailConfirmed) + .WhereIf(isExternal == true, x => x.IsExternal) .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) .WhereIf(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) @@ -222,10 +222,10 @@ public class EfCoreIdentityUserRepository : EfCoreRepository identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) + .WhereIf(tenantId.HasValue, identityUser => identityUser.TenantId == tenantId) .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) + .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name == name) + .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) .WhereIf(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) .WhereIf(notActive == true, x => !x.IsActive) - .WhereIf(emailConfirmed == true, x => !x.EmailConfirmed) - .WhereIf(isExternal == true, x => !x.IsExternal) + .WhereIf(emailConfirmed == true, x => x.EmailConfirmed) + .WhereIf(isExternal == true, x => x.IsExternal) .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) .WhereIf(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index 54731d56e4..d4a9e05cc3 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -140,10 +140,10 @@ public class MongoIdentityUserRepository : MongoDbRepository>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) + .WhereIf>(tenantId.HasValue, identityUser => identityUser.TenantId == tenantId.Value) .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) + .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name == name) + .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) .WhereIf>(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd > DateTimeOffset.UtcNow) .WhereIf>(notActive == true, x => !x.IsActive) - .WhereIf>(emailConfirmed == true, x => !x.EmailConfirmed) - .WhereIf>(isExternal == true, x => !x.IsExternal) + .WhereIf>(emailConfirmed == true, x => x.EmailConfirmed) + .WhereIf>(isExternal == true, x => x.IsExternal) .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) .WhereIf(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) @@ -226,10 +226,10 @@ public class MongoIdentityUserRepository : MongoDbRepository>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) + .WhereIf>(tenantId.HasValue, identityUser => identityUser.TenantId == tenantId.Value) .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) + .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name == name) + .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) .WhereIf>(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd > DateTimeOffset.UtcNow) .WhereIf>(notActive == true, x => !x.IsActive) - .WhereIf>(emailConfirmed == true, x => !x.EmailConfirmed) - .WhereIf>(isExternal == true, x => !x.IsExternal) + .WhereIf>(emailConfirmed == true, x => x.EmailConfirmed) + .WhereIf>(isExternal == true, x => x.IsExternal) .WhereIf>(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf>(minCreationTime != null, p => p.CreationTime >= minCreationTime) .WhereIf>(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) From 320a3829adab66bb4bed29ed4b97caa5b490c95b Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Nov 2022 14:20:10 +0300 Subject: [PATCH 21/86] Initial state of Bulk Operations article --- .../2022-11-28-ef-bulk-operations/POST.md | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md new file mode 100644 index 0000000000..3f679abf98 --- /dev/null +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -0,0 +1,57 @@ +# Entity Framework Core Bulk Operations +Entity Framework tracks all the entity changes and applies those changes to database one by one when `SaveChanges()` method called. There was no way to execute bulk operations in Entity Framework Core without a dependency. + +As you know [Entity Framework Extensions](https://entityframework-extensions.net/bulk-savechanges) library were doing it but it was not free. + +There was no other solution until now. [Bulk Operations](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#executeupdate-and-executedelete-bulk-updates) are now available in Entity Framework Core with .NET 7. + +With .NET 7, there are two new methods such as `ExecuteUpdate` and `ExecuteDelete` available to execute bulk operations. It's a similar usage with Entity Framework Core Extensions library if you're familiar with it. + +You can visit the microsoft example [here](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#executeupdate-and-executedelete-bulk-updates) about how to use it. + + +## Bulk Operations in ABP Framework + +ABP Framework supports Entity Framework Core as its ORM. So, you can use these new methods in your repository classes in your ABP applications. But there is another feature that ABP Framework provides: `IEfCoreBulkOperationProvider`. You can visit the [documentation](https://docs.abp.io/en/abp/latest/Entity-Framework-Core#customize-bulk-operations) to learn more about it. You always have full control of execution of bulk operations in your ABP applications. When you call `InsertMany`, `DeleteMany` or `UpdateMany` methods of repository, that provider will be invoked and you can customize all the queries from one point. Mostly you don't need to implement & customize that interface, but it's good to know that you can do it if you need. + +## Usage in Repositories + +Most of real world case scenarios, you need custom queries to execute bulk operations. You can't manage all the cases with overriding `IEfCoreBulkOperationProvider` even you can't identify entities in this provider because it's not aware of the properties of entities. Best way to use this new feature is inside the repositories. + +Let me show an example below: + +```csharp +public class BookEntityFrameworkCoreRepository : EfCoreRepository, IBookRepository +{ + public BookEntityFrameworkCoreRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public async Task UpdateListingAsync() + { + var dbSet = await GetDbSetAsync(); + + dbSet + .Where(x => x.IsListed && x.PublishedOn.Year <= 2022) + .ExecuteUpdate(s => s.SetProperty(x => x.IsListed, x => false)); + } + + public async Task DeleteOldBooksAsync() + { + var dbSet = await GetDbSetAsync(); + + dbSet.Where(x => x.PublishedOn.Year <= 2000) + .ExecuteDelete(); + } + + public async Task ImportAsync(List books) + { + var dbSet = await GetDbSetAsync(); + + // No need an action for bulk inserting. + await base.InsertManyAsync(books); + } +} +``` + +> There is no need to take an action for bulk inserting. You can use `InsertManyAsync` method of repository instead of creating a new method for it if you don't have a custom logic. It'll use new bulk inserting feature autmatically since it's available in EF Core 7.0. \ No newline at end of file From a359b6a16d83b2e384fe653aeef90f9decf6823b Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Nov 2022 14:27:46 +0300 Subject: [PATCH 22/86] Spellcheck fix --- .../en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md index 3f679abf98..d439edd070 100644 --- a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -54,4 +54,4 @@ public class BookEntityFrameworkCoreRepository : EfCoreRepository There is no need to take an action for bulk inserting. You can use `InsertManyAsync` method of repository instead of creating a new method for it if you don't have a custom logic. It'll use new bulk inserting feature autmatically since it's available in EF Core 7.0. \ No newline at end of file +> There is no need to take an action for bulk inserting. You can use `InsertManyAsync` method of repository instead of creating a new method for it if you don't have a custom logic. It'll use new bulk inserting feature automatically since it's available in EF Core 7.0. \ No newline at end of file From d915921020d8ad3d4d39666207e3f7b88730acd5 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Nov 2022 14:29:01 +0300 Subject: [PATCH 23/86] Update Extensions-Overall.md --- docs/en/UI/Angular/Extensions-Overall.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/UI/Angular/Extensions-Overall.md b/docs/en/UI/Angular/Extensions-Overall.md index 8f7b697e59..2bb9862b1d 100644 --- a/docs/en/UI/Angular/Extensions-Overall.md +++ b/docs/en/UI/Angular/Extensions-Overall.md @@ -11,7 +11,7 @@ See the documents below for the details: ## Extensible Table Component -Using [ngx-datatable](https://github.com/swimlane/ngx-datatable) in extensinble table. +Using [ngx-datatable](https://github.com/swimlane/ngx-datatable) in extensible table. ````ts Date: Mon, 28 Nov 2022 14:45:51 +0300 Subject: [PATCH 24/86] quick fix --- .../2022-11-28-ef-bulk-operations/POST.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md index d439edd070..1aa356bf3e 100644 --- a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -1,22 +1,22 @@ # Entity Framework Core Bulk Operations -Entity Framework tracks all the entity changes and applies those changes to database one by one when `SaveChanges()` method called. There was no way to execute bulk operations in Entity Framework Core without a dependency. +Entity Framework tracks all the entity changes and applies those changes to the database one by one when the `SaveChanges()` method is called. There was no way to execute bulk operations in Entity Framework Core without a dependency. -As you know [Entity Framework Extensions](https://entityframework-extensions.net/bulk-savechanges) library were doing it but it was not free. +As you know the [Entity Framework Extensions](https://entityframework-extensions.net/bulk-savechanges) library was doing it but it was not free. There was no other solution until now. [Bulk Operations](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#executeupdate-and-executedelete-bulk-updates) are now available in Entity Framework Core with .NET 7. -With .NET 7, there are two new methods such as `ExecuteUpdate` and `ExecuteDelete` available to execute bulk operations. It's a similar usage with Entity Framework Core Extensions library if you're familiar with it. +With .NET 7, there are two new methods such as `ExecuteUpdate` and `ExecuteDelete` available to execute bulk operations. It's a similar usage with the Entity Framework Core Extensions library if you're familiar with it. You can visit the microsoft example [here](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#executeupdate-and-executedelete-bulk-updates) about how to use it. ## Bulk Operations in ABP Framework -ABP Framework supports Entity Framework Core as its ORM. So, you can use these new methods in your repository classes in your ABP applications. But there is another feature that ABP Framework provides: `IEfCoreBulkOperationProvider`. You can visit the [documentation](https://docs.abp.io/en/abp/latest/Entity-Framework-Core#customize-bulk-operations) to learn more about it. You always have full control of execution of bulk operations in your ABP applications. When you call `InsertMany`, `DeleteMany` or `UpdateMany` methods of repository, that provider will be invoked and you can customize all the queries from one point. Mostly you don't need to implement & customize that interface, but it's good to know that you can do it if you need. +ABP Framework supports Entity Framework Core as its ORM. So, you can use these new methods in your repository classes in your ABP applications. But there is another feature that the ABP Framework provides: `IEfCoreBulkOperationProvider`. You can visit the [documentation](https://docs.abp.io/en/abp/latest/Entity-Framework-Core#customize-bulk-operations) to learn more about it. You always have full control of the execution of bulk operations in your ABP applications. When you call the `InsertMany`, `DeleteMany` or `UpdateMany` methods of the repository, that provider will be invoked and you can customize all the queries from one point. You don't mostly need to implement & customize that interface, but it's good to know that you can do it if you need. ## Usage in Repositories -Most of real world case scenarios, you need custom queries to execute bulk operations. You can't manage all the cases with overriding `IEfCoreBulkOperationProvider` even you can't identify entities in this provider because it's not aware of the properties of entities. Best way to use this new feature is inside the repositories. +In most of the real world case scenarios, you need custom queries to execute bulk operations. You can't manage all the cases by overriding `IEfCoreBulkOperationProvider` and you can't even identify the entities in this provider because it's not aware of the properties of the entities. The best way to use this new feature is inside the repositories. Let me show an example below: @@ -48,10 +48,10 @@ public class BookEntityFrameworkCoreRepository : EfCoreRepository There is no need to take an action for bulk inserting. You can use `InsertManyAsync` method of repository instead of creating a new method for it if you don't have a custom logic. It'll use new bulk inserting feature automatically since it's available in EF Core 7.0. \ No newline at end of file +> There is no need to take an action for bulk inserting. You can use the `InsertManyAsync` method of the repository instead of creating a new method for it if you don't have custom logic. It'll use a new bulk inserting feature automatically since it's available in EF Core 7.0. From dcf42700b231d5f4e627b9821794b5c9d14743d5 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Nov 2022 15:30:11 +0300 Subject: [PATCH 25/86] Update POST.md --- .../en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md index 1aa356bf3e..84666a59da 100644 --- a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -55,3 +55,5 @@ public class BookEntityFrameworkCoreRepository : EfCoreRepository There is no need to take an action for bulk inserting. You can use the `InsertManyAsync` method of the repository instead of creating a new method for it if you don't have custom logic. It'll use a new bulk inserting feature automatically since it's available in EF Core 7.0. + +> `ExecuteDeleteAsync` breaks the soft delete and auditing since deleted entities are removed from the change tracker. ABP can't handle it. So, you have to be careful while using it. \ No newline at end of file From 95bd723edf2b0e3f58bb2a3a1e7dcbe8cb275b17 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Nov 2022 15:54:41 +0300 Subject: [PATCH 26/86] Update title of article --- .../en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md index 84666a59da..fe4f677c4a 100644 --- a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -1,4 +1,4 @@ -# Entity Framework Core Bulk Operations +# Bulk Operations with Entity Framework Core 7.0 Entity Framework tracks all the entity changes and applies those changes to the database one by one when the `SaveChanges()` method is called. There was no way to execute bulk operations in Entity Framework Core without a dependency. As you know the [Entity Framework Extensions](https://entityframework-extensions.net/bulk-savechanges) library was doing it but it was not free. From 724e86e770ba034e79e376743665fb5260a218cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Mon, 28 Nov 2022 16:38:00 +0300 Subject: [PATCH 27/86] fix accounting email --- .../AbpIoLocalization/Commercial/Localization/Resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index f38f7d92dc..8a0e47c529 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -210,7 +210,7 @@ "TrialPlan": "Do you have a trial plan?", "TrialPlanExplanation": "It has a 14 days trial period for the ABP Commercial team license. For more information visit here. Furthermore, for the Team licenses we provide a 30 days money-back guarantee. You can just request a refund in the first 30 days. For the Business and Enterprise licenses, we provide 60% refund in 30 days. This is because Business and Enterprise licenses include the full source code of all the modules and the themes.", "DoYouAcceptBankWireTransfer": "Do you accept bank wire transfers?", - "DoYouAcceptBankWireTransferExplanation": "Yes, we accept bank wire transfers.
After sending the license fee via bank transfer, send your receipt and requested license type to accounting@abp.io.
Our international bank account information:", + "DoYouAcceptBankWireTransferExplanation": "Yes, we accept bank wire transfers.
After sending the license fee via bank transfer, send your receipt and requested license type to accounting@volosoft.com.
Our international bank account information:", "HowToUpgrade": "How to upgrade existing applications when a new version is available?", "HowToUpgradeExplanation1": "When you create a new application using ABP Commercial, all the modules and theme are used as NuGet and NPM packages. So, you can easily upgrade the packages when a new version is available.", "HowToUpgradeExplanation2": "In addition to the standard NuGet/NPM upgrades, ABP CLI provides an update command that automatically finds and upgrades all ABP related packages in your solution.", From 810d7fd62cc697356192997601b3af30bc2e2165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20=C3=87A=C4=9EDA=C5=9E?= Date: Mon, 28 Nov 2022 16:47:06 +0300 Subject: [PATCH 28/86] Created article for Model building conventions in Entity Framework Core 7.0 --- .../POST.md | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md diff --git a/docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md b/docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md new file mode 100644 index 0000000000..366c6e3a24 --- /dev/null +++ b/docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md @@ -0,0 +1,88 @@ +# Model building conventions in Entity Framework Core 7.0 + +In this article, I will show you one of the new features of EF Core 7 named "Model building conventions". + +Entity Framework Core uses a metadata model to describe how entity types are mapped to the database. Before EF Core 7.0, it was not possible to remove or replace existing conventions or add new conventions. With EF Core 7.0, this is now possible. To read more about it, you can visit its [documentation](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#model-building-conventions). + +EF Core uses many built-in conventions. You can see the full list of the conventions on `IConvetion` Interface API [documentation](https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.metadata.conventions.iconvention?view=efcore-7.0). + +If you want to add, remove or replace a convention, you need to override `ConfigureConventions` method of your DbContext as shown below; + +```csharp +protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) +{ + configurationBuilder.Conventions.Remove(typeof(MyCustomConvention)); +} +``` + +## Allowed Operations + +### Removing an existing convention + +Existing conventions provided by EF Core are well thought and useful, but sometimes some of them might not be a good candidate for your application. In such cases, you can remove an existing convention as shown below; + +```csharp +protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) +{ + configurationBuilder.Conventions.Remove(typeof(ForeignKeyIndexConvention)); +} +``` + +### Adding a new convention + +Just like removing a convention, we can add a completely new convention as well. You can define many different conventions here. For example, you can specify a standard precision for all decimal fields in your entities. + +```csharp +public class DecimalPrecisionConvention : IModelFinalizingConvention + { + public void ProcessModelFinalizing(IConventionModelBuilder modelBuilder, IConventionContext context) + { + foreach (var property in modelBuilder.Metadata.GetEntityTypes() + .SelectMany( + entityType => entityType.GetDeclaredProperties() + .Where( + property => property.ClrType == typeof(decimal)))) + { + property.Builder.HasPrecision(2); + } + } + } +``` + +Note that, conventions are executed in the order they are added. So you need to be careful in which order they are added. + +### Replacing an existing convention + +Sometimes, a default convention might work slightly different than what your app expects. In such cases, you can create your own implementation by inheriting from that convention and replace the default one. For example, you can create a convention as shown below; + +```csharp +public class MyCustomConvention : ADefaultEfCoreConvention +{ + public MyCustomConvention(ProviderConventionSetBuilderDependencies dependencies) + : base(dependencies) + { + } + // override the methods you want to change. +} +``` + +Then, you can replace the default one with your implementation as shown below; + +```csharp +protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) +{ + configurationBuilder.Conventions.Replace( + serviceProvider => new MyCustomConvention( + serviceProvider.GetRequiredService())); +} +``` + +As a final note, conventions never override configuration marked as **DataAnnotation** or **Explicit**. This means that, even if there is a convention, if the property has a `DataAnnotation` attribute or configuration in `OnModelCreating`, convetion will not be used. Here are the configuration types EF Core uses; + +* **Explicit:** The model element was explicitly configured in OnModelCreating +* **DataAnnotation:** The model element was configured using a mapping attribute (aka data annotation) on the CLR type +* **Convention:** The model element was configured by a model building convention + +## Using in ABP-based solution + +Since ABP uses EF Core, you can use this feature in ABP as well. \ No newline at end of file From e8af4cc1779506db1c0683866dc1a1c05b6b3248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20=C3=87A=C4=9EDA=C5=9E?= Date: Mon, 28 Nov 2022 17:22:12 +0300 Subject: [PATCH 29/86] use Add convention example instead of remove in the article entry --- .../2022-11-28-Model-building-conventions-ef7/POST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md b/docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md index 366c6e3a24..998b1e9735 100644 --- a/docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md +++ b/docs/en/Community-Articles/2022-11-28-Model-building-conventions-ef7/POST.md @@ -11,7 +11,7 @@ If you want to add, remove or replace a convention, you need to override `Config ```csharp protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { - configurationBuilder.Conventions.Remove(typeof(MyCustomConvention)); + configurationBuilder.Conventions.Add(_ => new MyCustomConvention()); } ``` From b902b182c975d7002669e7d1cef4a6e1e5ed9767 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Nov 2022 17:41:11 +0300 Subject: [PATCH 30/86] Update docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Halil İbrahim Kalkan --- .../en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md index fe4f677c4a..f138b7ef91 100644 --- a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -56,4 +56,4 @@ public class BookEntityFrameworkCoreRepository : EfCoreRepository There is no need to take an action for bulk inserting. You can use the `InsertManyAsync` method of the repository instead of creating a new method for it if you don't have custom logic. It'll use a new bulk inserting feature automatically since it's available in EF Core 7.0. -> `ExecuteDeleteAsync` breaks the soft delete and auditing since deleted entities are removed from the change tracker. ABP can't handle it. So, you have to be careful while using it. \ No newline at end of file +> If you use `ExecuteDeleteAsync` or `ExecuteUpdateAsync`, then ABP's soft delete and auditing features can not work. Because these ABP features work with EF Core's change tracking system and these new methods doesn't work with the change tracking system. So, use them carefully. \ No newline at end of file From 1f5f615c65c33c2ff7cbad22bfc65baea407ad70 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Nov 2022 17:41:59 +0300 Subject: [PATCH 31/86] Update POST.md --- .../2022-11-28-ef-bulk-operations/POST.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md index f138b7ef91..27b8022fac 100644 --- a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -31,17 +31,17 @@ public class BookEntityFrameworkCoreRepository : EfCoreRepository x.IsListed && x.PublishedOn.Year <= 2022) - .ExecuteUpdate(s => s.SetProperty(x => x.IsListed, x => false)); + .ExecuteUpdateAsync(s => s.SetProperty(x => x.IsListed, x => false)); } public async Task DeleteOldBooksAsync() { var dbSet = await GetDbSetAsync(); - dbSet.Where(x => x.PublishedOn.Year <= 2000) - .ExecuteDelete(); + await dbSet.Where(x => x.PublishedOn.Year <= 2000) + .ExecuteDeleteAsync(); } public async Task ImportAsync(List books) From 2db6d5516216ee1f4bd56a5b9b546383b243e323 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Nov 2022 17:42:37 +0300 Subject: [PATCH 32/86] Update POST.md --- .../2022-11-28-ef-bulk-operations/POST.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md index 27b8022fac..5b01cbcdd8 100644 --- a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -43,14 +43,6 @@ public class BookEntityFrameworkCoreRepository : EfCoreRepository x.PublishedOn.Year <= 2000) .ExecuteDeleteAsync(); } - - public async Task ImportAsync(List books) - { - var dbSet = await GetDbSetAsync(); - - // No need for an action for bulk inserting. - await base.InsertManyAsync(books); - } } ``` From e54a6e47271c45d92816a4858979fa88688c67ed Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Mon, 28 Nov 2022 17:45:57 +0300 Subject: [PATCH 33/86] Remove IEfCoreBulkOperationProvider reference from documentation --- .../2022-11-28-ef-bulk-operations/POST.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md index 5b01cbcdd8..edf88bfcaa 100644 --- a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -9,16 +9,11 @@ With .NET 7, there are two new methods such as `ExecuteUpdate` and `ExecuteDelet You can visit the microsoft example [here](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#executeupdate-and-executedelete-bulk-updates) about how to use it. - -## Bulk Operations in ABP Framework - -ABP Framework supports Entity Framework Core as its ORM. So, you can use these new methods in your repository classes in your ABP applications. But there is another feature that the ABP Framework provides: `IEfCoreBulkOperationProvider`. You can visit the [documentation](https://docs.abp.io/en/abp/latest/Entity-Framework-Core#customize-bulk-operations) to learn more about it. You always have full control of the execution of bulk operations in your ABP applications. When you call the `InsertMany`, `DeleteMany` or `UpdateMany` methods of the repository, that provider will be invoked and you can customize all the queries from one point. You don't mostly need to implement & customize that interface, but it's good to know that you can do it if you need. +ABP Framework supports Entity Framework Core as its ORM. So, you can use these new methods in your repository classes in your ABP applications without any limitation. ## Usage in Repositories -In most of the real world case scenarios, you need custom queries to execute bulk operations. You can't manage all the cases by overriding `IEfCoreBulkOperationProvider` and you can't even identify the entities in this provider because it's not aware of the properties of the entities. The best way to use this new feature is inside the repositories. - -Let me show an example below: +You can use these methods in your repositories as below: ```csharp public class BookEntityFrameworkCoreRepository : EfCoreRepository, IBookRepository @@ -40,7 +35,8 @@ public class BookEntityFrameworkCoreRepository : EfCoreRepository x.PublishedOn.Year <= 2000) + await dbSet + .Where(x => x.PublishedOn.Year <= 2000) .ExecuteDeleteAsync(); } } From b8da4aa916c2db958d197b64afdbcb1cdcd6c5a0 Mon Sep 17 00:00:00 2001 From: Salih Date: Mon, 28 Nov 2022 21:10:13 +0300 Subject: [PATCH 34/86] Update post.md --- .../2022-11-25-JSON-columns/post.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md index 95a7754936..bd2625ad59 100644 --- a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md +++ b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md @@ -68,7 +68,7 @@ public class MyDbContext : AbpDbContext builder.Entity(b => { - b.ToTable(MyProjectConsts.DbTablePrefix + "Persons", MyProjecConsts.DbSchema); + b.ToTable(MyProjectConsts.DbTablePrefix + "Persons", MyProjectConsts.DbSchema); b.ConfigureByConvention(); b.OwnsOne(x=>x.ContactDetails, c => { @@ -126,8 +126,13 @@ await UpdateAsync(person, true); ![image](./Database.png) + +### The Source Code +* You can find the full source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreJSONColumnDemo). +* You can see this pull [request](https://github.com/abpframework/abp-samples/pull/210) for the changes I've done after creating the application. + ### References -[https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns) +* [https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#json-columns) -[https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities](https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities) \ No newline at end of file +* [https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities](https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities) \ No newline at end of file From 89252a9607de99afb2252370dddf7dbde74cd2a2 Mon Sep 17 00:00:00 2001 From: Salih Date: Tue, 29 Nov 2022 09:00:45 +0300 Subject: [PATCH 35/86] Update post.md --- docs/en/Community-Articles/2022-11-25-JSON-columns/post.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md index 9c49c9f334..4f69b4eb1f 100644 --- a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md +++ b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md @@ -127,7 +127,6 @@ In this article, I've briefly introduced the JSON Columns feature that was shipp ### The Source Code * You can find the full source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreJSONColumnDemo). -* You can see this pull [request](https://github.com/abpframework/abp-samples/pull/210) for the changes I've done after creating the application. ### References From 506779db7747934a4087e2d7a9e9dfbfbbe36cbd Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 29 Nov 2022 15:24:08 +0800 Subject: [PATCH 36/86] CLI supports MAUI Blazor UI --- .../Volo/Abp/Cli/Commands/NewCommand.cs | 2 +- .../Commands/ProjectCreationCommandBase.cs | 20 +++++--- .../ProjectBuilding/Building/UiFramework.cs | 3 +- .../Templates/App/AppTemplateBase.cs | 40 ++++++++++++++- .../MauiBlazorChangeApplicationIdGuidStep.cs | 34 +++++++++++++ ...orPortChangeForSeparatedAuthServersStep.cs | 50 +++++++++++++++++++ .../Templates/Maui/MauiChangePortStep.cs | 1 + 7 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/MauiBlazorChangeApplicationIdGuidStep.cs create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/MauiBlazorPortChangeForSeparatedAuthServersStep.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 8421eb656b..ee0b6a90da 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -111,7 +111,7 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien var skipBundling = commandLineArgs.Options.ContainsKey(Options.SkipBundling.Long) || commandLineArgs.Options.ContainsKey(Options.SkipBundling.Short); if (!skipBundling) { - await RunBundleForBlazorWasmTemplateAsync(projectArgs); + await RunBundleForBlazorWasmOrMauiBlazorTemplateAsync(projectArgs); } await ConfigurePwaSupportForAngular(projectArgs); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index 2d5c9856cf..e0cbfe7d07 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -118,7 +118,7 @@ public abstract class ProjectCreationCommandBase Logger.LogInformation("DBMS: " + databaseManagementSystem); } - var uiFramework = GetUiFramework(commandLineArgs); + var uiFramework = GetUiFramework(commandLineArgs, template); if (uiFramework != UiFramework.NotSpecified) { Logger.LogInformation("UI Framework: " + uiFramework); @@ -413,22 +413,24 @@ public abstract class ProjectCreationCommandBase } } - protected async Task RunBundleForBlazorWasmTemplateAsync(ProjectBuildArgs projectArgs) + protected async Task RunBundleForBlazorWasmOrMauiBlazorTemplateAsync(ProjectBuildArgs projectArgs) { - if (AppTemplateBase.IsAppTemplate(projectArgs.TemplateName) && projectArgs.UiFramework == UiFramework.Blazor) + if (AppTemplateBase.IsAppTemplate(projectArgs.TemplateName) && projectArgs.UiFramework is UiFramework.Blazor or UiFramework.MauiBlazor) { - Logger.LogInformation("Generating bundles for Blazor Wasm..."); + var isWebassembly = projectArgs.UiFramework == UiFramework.Blazor; + var message = isWebassembly ? "Generating bundles for Blazor Wasm" : "Generating bundles for MAUI Blazor"; + Logger.LogInformation($"{message}..."); await EventBus.PublishAsync(new ProjectCreationProgressEvent { - Message = "Generating bundles for Blazor Wasm" + Message = message }, false); var directory = Path.GetDirectoryName( - Directory.GetFiles(projectArgs.OutputFolder, "*.Blazor.csproj", SearchOption.AllDirectories).First() + Directory.GetFiles(projectArgs.OutputFolder, isWebassembly? "*.Blazor.csproj" :"*.MauiBlazor.csproj", SearchOption.AllDirectories).First() ); - await _bundlingService.BundleAsync(directory, true); + await _bundlingService.BundleAsync(directory, true, projectType: isWebassembly ? BundlingConsts.WebAssembly : BundlingConsts.MauiBlazor); } } @@ -531,7 +533,7 @@ public abstract class ProjectCreationCommandBase } } - protected virtual UiFramework GetUiFramework(CommandLineArgs commandLineArgs) + protected virtual UiFramework GetUiFramework(CommandLineArgs commandLineArgs, string template = "app") { if (commandLineArgs.Options.ContainsKey("no-ui")) { @@ -554,6 +556,8 @@ public abstract class ProjectCreationCommandBase return UiFramework.Blazor; case "blazor-server": return UiFramework.BlazorServer; + case "maui-blazor" when template == AppProTemplate.TemplateName: + return UiFramework.MauiBlazor; default: throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage("UI Framework")); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/UiFramework.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/UiFramework.cs index b1ffe8cb11..5b1ebb56f4 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/UiFramework.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/UiFramework.cs @@ -7,5 +7,6 @@ public enum UiFramework Mvc = 2, Angular = 3, Blazor = 4, - BlazorServer = 5 + BlazorServer = 5, + MauiBlazor = 6 } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index 2ffa12bca7..b3bdf2d7e9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -132,7 +132,11 @@ public abstract class AppTemplateBase : TemplateInfo case UiFramework.BlazorServer: ConfigureWithBlazorServerUi(context, steps); break; - + + case UiFramework.MauiBlazor: + ConfigureWithMauiBlazorUi(context, steps); + break; + case UiFramework.Mvc: case UiFramework.NotSpecified: ConfigureWithMvcUi(context, steps); @@ -510,6 +514,37 @@ public abstract class AppTemplateBase : TemplateInfo } } + protected void ConfigureWithMauiBlazorUi(ProjectBuildContext context, List steps) + { + context.Symbols.Add("ui:maui-blazor"); + + steps.Add(new MauiBlazorChangeApplicationIdGuidStep()); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests")); + + if (context.BuildArgs.ExtraProperties.ContainsKey("separate-identity-server") || + context.BuildArgs.ExtraProperties.ContainsKey("separate-auth-server")) + { + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds")); + steps.Add(new MauiBlazorPortChangeForSeparatedAuthServersStep()); + steps.Add(new AppTemplateChangeDbMigratorPortSettingsStep("44300")); + + if (context.BuildArgs.MobileApp == MobileApp.ReactNative) + { + steps.Add(new ReactEnvironmentFilePortChangeForSeparatedAuthServersStep()); + } + } + else + { + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.AuthServer")); + steps.Add(new TemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host")); + steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305")); + } + } + protected void RemoveUnnecessaryPorts(ProjectBuildContext context, List steps) { steps.Add(new RemoveUnnecessaryPortsStep()); @@ -599,7 +634,8 @@ public abstract class AppTemplateBase : TemplateInfo { if ((context.BuildArgs.UiFramework == UiFramework.Mvc || context.BuildArgs.UiFramework == UiFramework.Blazor - || context.BuildArgs.UiFramework == UiFramework.BlazorServer) && + || context.BuildArgs.UiFramework == UiFramework.BlazorServer + || context.BuildArgs.UiFramework == UiFramework.MauiBlazor) && context.BuildArgs.MobileApp == MobileApp.None) { steps.Add(new MoveFolderStep("/aspnet-core/", "/")); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/MauiBlazorChangeApplicationIdGuidStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/MauiBlazorChangeApplicationIdGuidStep.cs new file mode 100644 index 0000000000..953447cfa5 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/MauiBlazorChangeApplicationIdGuidStep.cs @@ -0,0 +1,34 @@ +using System; +using System.Linq; +using System.Xml; +using Volo.Abp.Cli.ProjectBuilding.Building; +using Volo.Abp.Cli.Utils; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; + +public class MauiBlazorChangeApplicationIdGuidStep: ProjectBuildPipelineStep +{ + public override void Execute(ProjectBuildContext context) + { + var projectFile = context.Files.FirstOrDefault(f => f.Name.EndsWith("MyCompanyName.MyProjectName.MauiBlazor.csproj")); + + if (projectFile == null) + { + return; + } + + using (var stream = StreamHelper.GenerateStreamFromString(projectFile.Content)) + { + var doc = new XmlDocument { PreserveWhitespace = true }; + doc.Load(stream); + + var node = doc.SelectSingleNode("/Project/PropertyGroup/ApplicationIdGuid"); + if (node != null) + { + node.InnerText = Guid.NewGuid().ToString(); + } + + projectFile.SetContent(doc.OuterXml); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/MauiBlazorPortChangeForSeparatedAuthServersStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/MauiBlazorPortChangeForSeparatedAuthServersStep.cs new file mode 100644 index 0000000000..92b59de7f3 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/MauiBlazorPortChangeForSeparatedAuthServersStep.cs @@ -0,0 +1,50 @@ +using System; +using System.Linq; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; + +public class MauiBlazorPortChangeForSeparatedAuthServersStep: ProjectBuildPipelineStep +{ + public override void Execute(ProjectBuildContext context) + { + + var appsettingsFile = context.Files.FirstOrDefault(x => + !x.IsDirectory && + x.Name.EndsWith("aspnet-core/src/MyCompanyName.MyProjectName.MauiBlazor/appsettings.json", + StringComparison.InvariantCultureIgnoreCase) + ); + + if(appsettingsFile == null) + { + return; + } + + appsettingsFile.NormalizeLineEndings(); + var lines = appsettingsFile.GetLines(); + + for (var i = 1; i < lines.Length; i++) + { + var line = lines[i]; + + var previousLine = lines[i-1]; + + if (line.Contains("Authority") && line.Contains("localhost")) + { + line = line.Replace("44305", "44301"); + } + else if (previousLine.Contains("AbpAccountPublic") && line.Contains("BaseUrl") && line.Contains("localhost")) + { + line = line.Replace("44305", "44301"); + } + else if (previousLine.Contains("Default") && line.Contains("BaseUrl") && line.Contains("localhost")) + { + line = line.Replace("44305", "44300"); + } + + lines[i] = line; + } + + appsettingsFile.SetLines(lines); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Maui/MauiChangePortStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Maui/MauiChangePortStep.cs index 2b45d64b19..41b9393573 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Maui/MauiChangePortStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Maui/MauiChangePortStep.cs @@ -53,6 +53,7 @@ public class MauiChangePortStep : ProjectBuildPipelineStep { case UiFramework.Angular: case UiFramework.Blazor: + case UiFramework.MauiBlazor: authServerPort = "44305"; apiHostPort = "44305"; break; From 1eb0f20cac12575edd644d6c2d4803ccd982d4a9 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 29 Nov 2022 10:43:07 +0300 Subject: [PATCH 37/86] Create "Rate Limiting with ASP.NET Core 7" article --- .../2022-11-29-Rate-Limiting/Post.md | 229 ++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md diff --git a/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md b/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md new file mode 100644 index 0000000000..52fc9be63d --- /dev/null +++ b/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md @@ -0,0 +1,229 @@ +# Rate Limiting with ASP.NET Core 7.0 + +Rate limiting is a way of controlling traffic so that a web application or API receives. In other words, rate limiting helps you control the amount of traffic each user has access to at any given time. This is extremely useful when you want to manage the load on your server or services, avoid going over your monthly data transfer limit and allow the system to continue to function and meet service level agreements, even when an increase in demand places an extreme load on resources. In this article, we will look at why you need to use rate limiting, how the different rate limiting algorithms provided with .NET 7.0 work, and best practices for using rate limiting in your application. + +## What is rate limiting? + +Whether accidental or intentional, users may exhaust resources in a way that impacts others. When a number of requests are received on to resources for a long time, the server can run out of those resources. These resources can include memory, threads, connections, or anything else that is limited. To avoid this situation, set rate limiters. Rate limiters control the consumption of resources used by an instance of an application, a user, an individual tenant, or an entire service. + +## Why you need to use rate limiting? + +A rate limiting system is crucial in any application where you have to control or throttle user requests or traffic. This is especially true in applications running on a cloud hosting platform because the user’s traffic can affect the whole server where the application is hosted. + +Why do you need to implement rate limiting? Here are a few reasons: + +- To ensure that a system continues to meet service level agreements (SLA). +- To prevent a single user, tenant, service, or so on from monopolizing the resources provided by an application. +- To help cost-optimize a system by limiting the maximum resource levels needed to keep it functioning. + +## Rate limiter algorithms + +The [`RateLimiterOptionsExtensions`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.ratelimiting.ratelimiteroptionsextensions) class provides the following extension methods for rate limiting: + +- **[Fixed window](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#fixed-window-limit)**: Fixed-window limits—such as 3,000 requests per hour or 10 requests per day—are easy to state, but they are subject to spikes at the edges of the window, as available quota resets. Consider, for example, a limit of 3,000 requests per hour, which still allows for a spike of all 3,000 requests to be made in the first minute of the hour, which might overwhelm the service. +- [**Sliding window**:](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#sliding-window-limit) Sliding windows have the benefits of a fixed window, but the rolling window of time smooths out bursts. Systems such as Redis facilitate this technique with expiring keys. +- [**Token bucket**](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#token-bucket-limit): A token bucket maintains a rolling and accumulating budget of usage as a balance of tokens. A token bucket adds tokens at some rate. When a service request is made, the service attempts to withdraw a token (decrementing the token count) to fulfill the request. If there are no tokens in the bucket, the service has reached its limit and responds with backpressure. +- [**Concurrency**](https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0#concurrency-limiter): A concurrency limiter is the simplest form of rate limiting. It doesn’t look at time, just at number of concurrent requests. + +In order to be more realistic example, instead of making an example with each rate limiter algorithm, we will implement the following three algorithms in a **ABP-based** application. + +1. We will add a `SlidingWindowLimiter` with a partition for all anonymous users. +2. We will add a `TokenBucketRateLimiter` with a partition for each authenticated user. +3. We will add `ConcurrencyLimiter` with a partition for each Tenant. + +**Note:** The following sample isn't meant for production code but is an example of how to use the limiters in ABP-based applications. + +### Limiter with `OnRejected`, `RetryAfter`, and `GlobalLimiter` + +#### Add rate limiter + +Let's create the following method in `MyProjectNameWebModule.cs` class in `MyProjectName.Web` project. + +**Note:** If the `**.Web` project is not in your application, you can do the same in the project where your application is hosted. + +```csharp +private void ConfigureRateLimiters(ServiceConfigurationContext context) +{ + context.Services.AddRateLimiter(limiterOptions => + { + limiterOptions.OnRejected = (context, cancellationToken) => + { + if (context.Lease.TryGetMetadata(MetadataName.RetryAfter, out var retryAfter)) + { + context.HttpContext.Response.Headers.RetryAfter = + ((int) retryAfter.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo); + } + + context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests; + context.HttpContext.RequestServices.GetService()? + .CreateLogger("Microsoft.AspNetCore.RateLimitingMiddleware") + .LogWarning("OnRejected: {RequestPath}", context.HttpContext.Request.Path); + + return new ValueTask(); + }; + + limiterOptions.AddPolicy("UserBasedRateLimiting", context => + { + var currentUser = context.RequestServices.GetService(); + + if (currentUser is not null && currentUser.IsAuthenticated) + { + return RateLimitPartition.GetTokenBucketLimiter(currentUser.UserName, _ => new TokenBucketRateLimiterOptions + { + TokenLimit = 10, + QueueProcessingOrder = QueueProcessingOrder.OldestFirst, + QueueLimit = 3, + ReplenishmentPeriod = TimeSpan.FromMinutes(1), + TokensPerPeriod = 4, + AutoReplenishment = true + }); + } + + return RateLimitPartition.GetSlidingWindowLimiter("anonymous-user", + _ => new SlidingWindowRateLimiterOptions + { + PermitLimit = 2, + QueueProcessingOrder = QueueProcessingOrder.OldestFirst, + QueueLimit = 1, + Window = TimeSpan.FromMinutes(1), + SegmentsPerWindow = 2 + }); + }); + + limiterOptions.GlobalLimiter = PartitionedRateLimiter.Create(context => + { + var currentTenant = context.RequestServices.GetService(); + + if (currentTenant is not null && currentTenant.IsAvailable) + { + return RateLimitPartition.GetConcurrencyLimiter(currentTenant!.Name, _ => new ConcurrencyLimiterOptions + { + PermitLimit = 5, + QueueProcessingOrder = QueueProcessingOrder.OldestFirst, + QueueLimit = 1 + }); + } + + return RateLimitPartition.GetNoLimiter("host"); + }); + }); +} +``` + +In the above example, `TokenBucketLimiter` is used for each authenticated user, while `SlidingWindowLimiter` is used all anonymous user. Additionally, as a global limiter, `ConcurrencyLimiter` is used for each tenant, while rate limiting is disabled for the host(tenant is not available). Also, for requests that are rejected when the limit is reached, sets the response status code to [429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) and the response mentions when to retry (if available from the rate-limiting metadata). + +Let's call the `ConfigureRateLimiters` method that we created in the `ConfigureServices` method. + +The final version of the `ConfigureServices` method: + +```csharp +public override void ConfigureServices(ServiceConfigurationContext context) +{ + var hostingEnvironment = context.Services.GetHostingEnvironment(); + var configuration = context.Services.GetConfiguration(); + + ConfigureBundles(); + ConfigureUrls(configuration); + ConfigurePages(configuration); + ConfigureAuthentication(context); + ConfigureImpersonation(context, configuration); + ConfigureAutoMapper(); + ConfigureVirtualFileSystem(hostingEnvironment); + ConfigureNavigationServices(); + ConfigureAutoApiControllers(); + ConfigureSwaggerServices(context.Services); + ConfigureExternalProviders(context); + ConfigureHealthChecks(context); + ConfigureCookieConsent(context); + ConfigureTheme(); + + Configure(options => + { + options.IsDynamicPermissionStoreEnabled = true; + }); + + ConfigureRateLimiters(context); // added +} +``` + +#### Add RateLimiter middleware + +Add the following line just before the `app.UseConfiguredEndpoints(...)` line to add the `RateLimiter` middleware to your ASP.NET Core request pipeline: + +```csharp +app.UseRateLimiter(); +``` + +#### Use rate limiter for all controllers + +Let's edit the `ConfiguredEndpoints` middleware as follows: + +```csharp +app.UseConfiguredEndpoints(endpoints => +{ + endpoints.MapRazorPages() + .DisableRateLimiting(); + + endpoints.MapControllers() + .RequireRateLimiting("UserBasedRateLimiting"); +}); +``` + +- **DisableRateLimiting:** It is used to disable `ConcurrencyLimiter` for razor pages, which we set globally when tenant is available. +- **RequireRateLimiting:** We have enabled the rate limiter, which we define according to whether the user is authenticated or not, for all controllers. + +## `EnableRateLimiting` and `DisableRateLimiting` attributes + +It's kind of unrealistic to always use rate limiting for all controllers or pages. Many times, we may want to throttle a particular endpoint or page. In such cases, we can use the `EnableRateLimiting` and `DisableRateLimiting` attributes. The `EnableRateLimiting` and `DisableRateLimiting` attributes can be applied to a controller, action method, or razor rage. Check [here](https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0#enableratelimiting-and-disableratelimiting-attributes) for more. + +## Rate limit an HTTP handler + +Rate limiting when sending an HTTP request can be good practice, especially in service-to-service communication. Because, resources are consumed by apps that rely on them, and when an app makes too many requests for a single resource, it can lead to *resource contention*. Resource contention occurs when a resource is consumed by too many clients, and the resource is unable to serve all of the apps that are requesting it. This can result in a poor user experience, and in some cases, it can even lead to a denial of service (DoS) attack. Since there are similar codes, I will not mention an example in this article, but to avoid such situations, you can write your own HTTP handler like [here](https://learn.microsoft.com/en-us/dotnet/core/extensions/http-ratelimiter#implement-a-delegatinghandler-subclass). + +## How does it work? + +[System.Threading.RateLimiting](https://www.nuget.org/packages/System.Threading.RateLimiting) provides the primitives for writing rate limiters as well as providing a few commonly used algorithms built-in. The main type is the abstract base class [RateLimiter](https://github.com/dotnet/runtime/blob/main/src/libraries/System.Threading.RateLimiting/src/System/Threading/RateLimiting/RateLimiter.cs). + +```csharp +public abstract class RateLimiter : IAsyncDisposable, IDisposable +{ + public abstract int GetAvailablePermits(); + public abstract TimeSpan? IdleDuration { get; } + + public RateLimitLease Acquire(int permitCount = 1); + public ValueTask WaitAsync(int permitCount = 1, CancellationToken cancellationToken = default); + + public void Dispose(); + public ValueTask DisposeAsync(); +} +``` + +`RateLimiter` contains `Acquire` and `WaitAsync` as the core methods for trying to gain permits for a resource that is being protected. Depending on the application the protected resource may need to acquire more than 1 permits, so `Acquire` and `WaitAsync` both accept an optional `permitCount` parameter. `Acquire` is a synchronous method that will check if enough permits are available or not and return a `RateLimitLease` which contains information about whether you successfully acquired the permits or not. `WaitAsync` is similar to `Acquire` except that it can support queuing permit requests which can be de-queued at some point in the future when the permits become available, which is why it’s asynchronous and accepts an optional `CancellationToken` to allow canceling the queued request. + +`RateLimitLease` has an `IsAcquired` property which is used to see if the permits were acquired. Additionally, the `RateLimitLease` may contain metadata such as a suggested retry-after period if the lease failed. Finally, the `RateLimitLease` is disposable and should be disposed when the code is done using the protected resource. The disposal will let the `RateLimiter` know to update its limits based on how many permits were acquired. + +## Limitations + +In most cases, the rate-limiting middleware provided with ASP.NET 7.0 will meet your requirements. However, if you would want to return statistics about your limits (e.g. [like GitHub does](https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#rate-limit-http-headers)), you’ll find the ASP.NET rate limiting middleware does not support this. You won’t have access to the “number of requests remaining” or other metadata. Not in `OnRejected`, and definitely not if you want to return this data as headers on every request. + +## Best practices for rate limiting + +In order to use rate limiting properly, you need to have a solid understanding of the types of limiting available, as well as the data rate and data volume of your service. You also need to have a clear idea of how many users you expect to use your service as well as how they will interact with it. The best practices for rate limiting are as follows: +- Find the right rate limiter algorithm for your endpoint. I mean, the cost of an endpoint should be considered when selecting a limiter. The cost of an endpoint includes the resources used, for example, time, data access, CPU, and I/O. +- Set realistic limits. Once you’ve figured out all the above, you need to set realistic limits for each service. Then, before deploying an app using rate limiting to production, stress test the app to validate the rate limiters and options used. For example, create a [JMeter script](https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html) with a tool like [BlazeMeter](https://guide.blazemeter.com/hc/articles/207421695-Writing-your-first-JMeter-script) or [Apache JMeter HTTP(S) Test Script Recorder](https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html) and load the script to [Azure Load Testing](https://learn.microsoft.com/en-us/azure/load-testing/overview-what-is-azure-load-testing). +- In response to rate-limiting, intermittent, or non-specific errors, a client should generally retry the request after a delay. It is a best practice for this delay to increase exponentially after each failed request, which is referred to as *exponential backoff*. When many clients might be making schedule-based requests (such as fetching results every hour), additional random time (*jitter*) should be applied to the request timing, the backoff period, or both to ensure that these multiple client instances don't become periodic [thundering herd](https://www.wikiwand.com/en/Thundering_herd_problem), and themselves cause a form of DDoS. + +## Conclusion + +In this article, we’ve covered what rate limiting is, why you need to use it and the best practices for doing so. We’ve also looked at how to use three rate-limiting algorithms that are provided with .NET 7.0 on ABP-based applications and how rate-limiting works. Now that you’re familiar with the concept of rate limiting, it’s time to start implementing rate limiting in your application. This will allow you to control the traffic and ensure that your application is running smoothly without any issues. + +## References + +- https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0 +- https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/ +- https://blog.maartenballiauw.be/post/2022/09/26/aspnet-core-rate-limiting-middleware.html +- https://learn.microsoft.com/en-us/dotnet/core/extensions/http-ratelimiter +- https://learn.microsoft.com/en-us/azure/architecture/patterns/rate-limiting-pattern +- https://learn.microsoft.com/en-us/azure/architecture/patterns/throttling +- https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet +- https://cloud.google.com/architecture/rate-limiting-strategies-techniques \ No newline at end of file From 7e0da07854c6a1ac06277c7ed9cd44e4ba15500d Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 29 Nov 2022 10:54:54 +0300 Subject: [PATCH 38/86] add cover image to rate limitin article --- .../2022-11-29-Rate-Limiting/cover-image.png | Bin 0 -> 640294 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/en/Community-Articles/2022-11-29-Rate-Limiting/cover-image.png diff --git a/docs/en/Community-Articles/2022-11-29-Rate-Limiting/cover-image.png b/docs/en/Community-Articles/2022-11-29-Rate-Limiting/cover-image.png new file mode 100644 index 0000000000000000000000000000000000000000..cedae39a3b47281ee05dde67a1ee0fa83211b2ed GIT binary patch literal 640294 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

r3X>p|rEGa(kRRKg>)p1|doI_^ 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%0D( zG;=-=?&@5sa;<(Z1)oRzPq+H?^kLd+^`_g5Qu{D}TIOjl93&s%k$pK|C*>l&+f#Dz zXPdOsSKD)d^G9fIBcGXg_Nxp0{4YOmaxGU}62I^(ci;c7a3|!p17~w=89-xO(RW*0Vs)C*hs(=_UAVbI%caIZHmjY@LMa8{LtDa_rq9*K z+2Ji%;a$~4Ze9*{|aOu88bnM?w zk?eju32E$H>+5~aQogfQIR#ZpJfewt$Uqk?gx#D@-g_skMQeA|F%|1c zC%FEp)x#DW+5}LR^|=6VE))M!sH0(*<5&iuQ+}o;rvd}u9U)<@#y7;-^dkZnwUEYb z1RWO1aax)&2G+uSUiL)Z9$ST5kEZpp-DKQqh!wK#|G6MA08!1bu5$;UKy7cQnXWw= zT_|UNiS=aki(WZUyR*nd^DSqSx*bliule+vH59X53Hi>eUm2sjGpru1<2E`GzS8nA z|8wddK(9i77<7)qbls_S=5hMDPBt&ZB;&4^!iL;&j+d73zbCWysY$rpaPOT$#Kn1O zIR6!XjI@(43lTHM7+80Ikr70YE8AKNcK{{Lz_y;4)$ODVdf0R8n#lHLwLW0I!Zx?p zb%n(kSWNKuCG9YDr{22L>hyVJJ6q&KC45Htuw?Uv>o7GvGLyT9A6$;sT=JBv_7muP zBY~y9vjhA�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

Cg6aLF40bNwc{ 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ֺv0JIOD;q+&B!t^lxm=`0$d(WN+ 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 z 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

5b#liRuv6 zw)U-obaosx13+e2O_*F${K#&(|2O8XXeaQw+uAX~BTyEsS15$aWAtDN=27SS_FO37 zdqM@j)c{@Sg0l4<^n1}|X$~A9AlT?u=jl&bc+%h@s$kT3byl+VR9nt2hlJL=c z@dp|fz?jxr$(j$(jL)>kJicC9!;O=;D5pmxd3roy6mvWt_x-fqlM*kTvBLtvF@MML z@0}3INE_W*UKc@@KA&`ajkJ&N`uG>@Fj61ZsX7bK^frL>#1O6pn;zB|^z)AWb=Mkq zu?^vYn2r63w}rT1CZVzhTI6{k8$??}2CWZwp%@QV5WM1C@5r+f2PSJj=B>sl4wkqO zyE2O5D8j&((XKoebPJVNeM*+oH3>R<6N- z*fzwnf&PA99tb|4TfA@r8r~qhJhDSZK8XEPkalf-&Xwx-+*su4qriOq??T9QOf$eT z)Yy-7QZd_E0S%Q`w9hRVhAmnle8gU`+)Uy>1^zmq*itjIjwGMB8NVh5Fnf<;iMa}< zJ+>KWZulb~vjUv5%%!q~T_waU`Am4nF3~B+E0fQPc<3F(jAuXgjEzA1bnz=}fE8@v?Z zU=W-uHJ()1NirNyQ2c-qq=834-vD1?RBt2k;L4MED=>0mme)t^!JRPr25<5E+gfWr zj2(XZc?*7_V)J((KvM7gZyt`%+u>;%1!(_7%7!ri^8`eD{663Y|4VkPX3k>({r#vLIAvZ0h%w~9*x198o~M0%624(Sr$V&P;Ehb@_CdwD zetsrSz{v2%y1I6;mnL*fL>rRo1dN#(I6cSKU_GEu$HGI;%sN3`+}N2i75$%Zfp|Ta zpOedp-#@oiPw7(;xA14tC?x_`K;xFKzaaemIGA&l&pls|^&X(SCKaUvR37Q#hd&~Y zcR)&hbGtplIU9GDw$;Ryw6^y-P>X4OpAo)g8+iPye-Unu=cnS*Jcjf<&$W5s^1=dH z@5%*Nt8hbJ{r80bngb!ASN9hBXR_@9LRBjHh9f}T7E8NM2wr%SK-5Wm0aB&qk|Un) zJ5;kqt7_!ct6ewvmAv3HIcfDhV>6DbRjDD3m1q2TV2|DpI`!opkMJf3vz#E0y{E{l znTfnAI72l=alD6BdrrR6=ExiL;6pM}EMB^ku&EsWly0Bw^F)YGdO{MPir=YZl8i_` zPAcsx+R%P2!ATMv$mbr`Nng1)D_8>nw1K1My-9iE-dMvbbdI=zEn-lPzYa1}QBMEv z@N?^^cipVyjG7RGI*a>Z-g$T-@3Qd5;*{NxHPU)7G9C|PJ;$4h6=bJqr82z8YJt|6 z-u=k$BjL|a(!`h0TJI#r2SR>L1X*qXkhamo_sWC^0N;>%``y6Ryr^=btk34&*maU4 zOahUjI#-e^>3EU@e*x-yf^XN1#x~ST*I)S^(cbEzFJ^nxd#@;wUmu9E-aEkCk0VqY z43Ebc;d!2dzwJ|(HQ46G<1rSQ_=jB+2rk~o`Z|-%`iM`BM>785ZGNu;Ey&)`*n_L_ zwEz)fBNUXi%4|hk-|3YFW4muj2BhgO^GadlOAK+AcWJhIJfIJe`6)nv2qE*_YX;w2 zIa2RiePqBY;*Iiv@Dxd>1#?Uy-$s2>zNP>>Ie9wsJ*mh6=hf{AX_H7$hr z6nPurZEOJQqjOwG?UB$^7UTU?tTeB0jxB`j|D|VmvIGm*Cc#RPg2wZ2o`hze2Q+iJ zX!+br5bHgP4>*;$1=LuEXd74BrQeOuB#>S1i)btS7NfFF^B~SPty39~c0NGUjb;mS zjzOOR*KR9AHCco&q9x!OAoiWASMsSa7>gS|rsemccf4<_ z%z-3_3QdAQ(4UdgneR_; z&AJL|!u+ChI9lU!@)s}UpEXoilYJfnlFW(lxhJ7!)}UsjCKwyW)%cpD@gzv7`3P76 z98aRC>%VJ*(n%SsH)2HWsEkBRW>QT!Hfy)B9wyuW?}6q_B>%6~(jy0R#DB8^f?b)a z1$3b@GgMUH>9~(44R1i` z?_k7Df~1riMks6C3tcdjT<#suQIaIKjmxnToR{c2BrCqj4`vJi>T6K~`J=FEmwAJ( zyRz&CNWpneJW5KiXtGwc%Zzc@P4b=Wa~=GFeOJ6}g7!#0?YZ2u->f7&JuliZ;eqNt zVY|Nn6E?DE?7HGYPRperkshz3N#NfFE8h4?XHb*DQZdaztcc}Uk3Vlu4M4Lk&>srK z9-%yPOFp0PcV$ItR+n6Y^$D0A7qexkua!=-Mz!hM(wLqkk!R+IY3pq7EgM^K8m9t18zDJT8wP zR<*(DM3OZSHR#Dg)LqMye4(!2kQ}nVgoHnRt3`;N-?E#yPraVEgFJkc#7!Q@BMvnk zoH1_R(leGPviDRt9`u8hHY+=((b?8aT~kG0*jktzd$59on!=KFO}RWnt&BiSOJ5Wp*At z?JXS>pVSd_N%#CD`aIkp0-f~PxplP{biyg#9?6jid50m~%_x=<;MO(|g59M2_8yBd z?ffzm*SQvK-qM&Qdi!3i zdpN19TK&vD7E0?v|D9c2ZO@YIq3r{?4nY-e!(_`)rIWGN8Ck>z|D%qZQ!O+RyZj zfZHyAT$xk>RYxxJFJIF9F`L~VK)<`jMsj@?Mg>5PY&eEhHef6CTOdgR9<5;KG&F04 zIn;^V&^RU6WRBW-xnLg+uetTODeDs2(I@yxgGQlbh03}Ya?X3W)u2W;5q%E zC-6fKR35bhV}O(d&N>d~Fh%xB;@iKY(Ndx&i{=Lue%OSD66&hKs!n=TAI$=^4kFY% z8{dZ1vwpaa=8#@Zz=g$Ieu;8)qJYDqPrj)A+1X=@;EstvEdWScIaXVM+UGCGMWv?_ zQbRh2w#LTV7vewij!J2PydlCfu<^8HuUXi`!9ek;ac@8(J&tgb*TL{J#+;qJpPP12 zLnoD;s0#!BCbkb=(x}r2z}Eipf+E4E^V;{V2X_{x<)vinDRR@>_vz$scO1TJk4ttn z*Ov{CuED>V0BRNcS-V+v#Y@o?%86STgu0?K0eLAx0Hy2FBfVSEd#NsW>Zbgu7 zJeW3FIPO`8&f+mlnEZ`zDRhhwOEPb#?{a?7$H|1KmZ+`g0RW%$dLz)u(B@d9uS;&^ zzwW(+4jR`X6h)M_%bf#SBy@tlZv>F*>rK*!2R|k~rfCiRlbGY=(pn;{mG6Wvp{09P z|9v~wFak-Y(0h&{Jrx`w?F5D66LW!>B?G*PBnhvVRtt`gedb3ht6QmNz>51 zmB@1F%TL0~gHL)GFr6m!ducx%T%VCmR?N&guJOYR+ze!EHnKFv{Oz5q?*;cHWi*}H z9JBi5*9PV3(M!I*&kw%8W-T9v7fESjKaUik&CoA)^QG}QT0rQ9tXuDOf6r<}TdzCj z#f$tBs&yX$bxM2vsNiZyr}6t#zyC|XUk!F9`P=U%c^Yoc$!WXmhP=6H8xGz9oC2Z= z>5~FHO;As-+-Vd~Ktns0Dg?D^ax%b&3eVHWi{x&DVUI)78^Z>3f)y?KOM=03ZNKL_t)u zN_!$b(D^|=9Adc#wXh);*>#d%V~p@T54`W&C3H^0Y+%XTUP?Mx&<3ig4tt>2X>--7 zQV>iE7_BD5M4ZBX(;yBlyb|pDj)tC|r%kGtAMNpUj#T(2DhQ$Fd13WlW}eSX`fhj*c9NpS@>EM@y@c&yv)~ z3Vsi~@Br@QTTMneVg4JyM+<-Rk?nUokf4!gAn#PuQJ~oH&9%aCjh-kUCFrbq&;pfs z&EFUyg#XfeaU z-$xi90D$;ZyC&@@L}gGSO1f3=`U{UfR*zFBT!)Z0@-M@UHYt6=P1xa~>4ND9Z!98& zP*8OI>$v`t(CI9Enw7?2YHJ|Uv?S+-ep@)R4fsk-18LA`8(q)WUh6O9@5Wj>1yX;K zUBTgH_sG5ARovG7al6BcDV1x=KdkQ;vIZOXu?mu%B+|$6Z(}BX88NnzePfNYp8$Zo z`b!Z}LJlC=0n#|d2=F|A3_3;}*V}}VyoL~C^=TL!Htj(W=Kygr*>Dp^I%(Vidj$@) zSwa}@97E%!v1=S56x$-d5-bFWxC>9?=Ji&wln>xG9}CxJkm7k`kZ{rC|JNZD_LhD2 z6YGtRx#YL*tS!klp0!0ZAO41%x!Lz10o)UDtNkoc0q`#@%-!JMsKsN&QJLL6x~t8 z_5s*@U!Vl1<*4QqtpspK&JBL2$2l!HS0&&!Ma4d7w0;F-pZQ~Oddo4+Q>*$6oyU{# zYfoze*yG~~WQOpkB)haWR==nD|5w(PXI{Te}ZJ!dJZ6#x0ydhkYUnXzvtD!o+him1*_b>Yin41eLIn~17+Tx zkmL2K0INJfWK63m>wknF5IC*c8Zu=QplAzSk`>_moX*BHJ{7x>VuG{2f_2W~9R6h6 z$-DhD&sz9K1$^ILU$t=ZT%VP%3YL7VSmWw7H$W;ztCal@K@K~n+p9%=3G(j%U7-*H zCVv6)#?Y9sRb#la+?Dl-KKHZm|9td0puXfM$L`dMUWpBiY=qNrvwwF2xSim2hy1oO zb{QG8J+#J(`$D|f0mBJY>}aX`+2rR4JWizssx#x77X^=!S>uKct%?{5pRBy7viXFt z>fQkq`%1o;kMGe#tIwb);|>U)d9i5%jw&y`G*1CbP8`C>n4X1iC4uv+>^5Mn zGVWKv3T|n#r&<5a#L>gITQr=^G2 zG;fZJ#}C2eTG`u2AhP9&bM)yn)z1LyYsphgI@FVypEO-|viNp3{^?B&?&`r6+iV&{ z|6Mx2WH@e-rN67{2k5l7%IZTYh7Iy+3)1kMQ*rbO(#C0$J;xq>ELM zGB4k9`{x0Gm=mu_qIutEz6F{IMRn&M1~>HfSlVGChL~SBKpV@19k(YgCl5=Pg8(cq zydQ&>g1sj{xsNxp|E`0{3KC^&#n_|be9wG|g<|A$WgK?`_G@4bc?D@0+&|n54rqe4ESGx)v-HLpzMTEe>?i~UxNR%DpIS0 z9)hr-zW|z{;jX+FoDhE?*k7gc%L?I!iZ`mK)+pD2@dM-G^2f4G)hLz z2xgoKFG$ICDY5cKC{=XaNb-)gH<5oM(eFtXNtM|nI+{68jnnZgn?CgfCP+GzC9{kB zG%;UCoY0Iez$XnDL1*seQbqVo5^|sLTR~1LlMn~Dlb+{sC6Kh@t`O?=sIU386uQC; zr(8Y_US8jpcfqoINV9*;f$%+H1|U9J#lZA2MmWj)EK9pf!)O(iy^w6WlFK3YJPIDt z`|1mq?5E~#^32dVhQO-#>r)>ZZTuepC7!>cq`m+mpE=~*xQ#tNXv1ki!&F-x;Drc( zVrw6bk_j{N`Db~Kt#J*w&eZH>Ja6jvB1kYuTGKwIJeZ2xLu-J_JnqYta)7TaxAcxe zi=Xg4=#Atv#@Veaogltr`JgYud8ZkREk{?4G<5h+*@82+wI<&zy}wMCk{g%wx@Rmr zG;7yszV#}I1wKUfTkGNUTImst?NJ0Xk+sR6Dz8n_)fB}$aUUCFq8^B5F7b@W+5rIk zWtHABM)>2TTv`*cSx7HwOP@gQC;XbfCFtGLuluv~{Y~)jy-7y|2#r7UR&^4j3_xiJ zF|tQp3LW)$8E@!)?zeVTyAb4n%wyWN)8~qK{uy}5uB!pZM(}Z)Z)B7e_Tjcv5fj7) zd712>Kz)8}*YK*~a|Qr--!xy()AA5)D|oRGV_MfW_H}mseR@5MPXON{A_P4owwokc zg|gdE{wHKZ;X&o0B$jT{r1kd+<}d>RAo!};SqtPKc2VB_qxL8X%{Lno=>_psp(iAT zzSYNhpCBe?ZUUV*R7h0;+T)#@yKwMixekI)6PuX3tj1BLygNZo*`|RJX5ep=O~Rz$8H)pJ(&3G z@Q{F8h)R&6jEU=Qr?taUYC@}pnXyGg@^0n+td87@YwbY3=b3de(RBlSL_D^{D6rHA zBhp<26hMM*r#&E#S@*p&H>cjed`h={g3o5}wb0PQ@E60;s?Y&zCAmKZ(*%VnC5&iK9ru@*^6XwsaveDa_}oNbQ>vS~?el;Jp! zZwlG(=1x8ew~;ZqS48TSTcf0fyLgfMzmV^Z41gST+%Nyuc>iy!B{B{2e6QN57(5P& zP};SfcR=F30MHb{HtikrEf$bkGzdB`gRmDUoC(0#Sv{nU6j~@xX<3gWEtcl-gJug^h40^j2(=Ixjh81o2(gh- zg70J`D@~jqjDcNG?oI&LE*?Ih$%s!DY}!dR!v-PoSnA8~(v4##gzds=EwxF}o-;|qyP}f-#%S72wVn7S{V#^Ow5l3^)u+!3! zc#WRG&cLRXCcRJT0WMch0+-d4_7DR6H*2I)23R7d3}hd)pAO!#iSQ@DNFS7j2Ltx8 z2D-A%HR?@D+PKG7Xx7#r%vXEOfXhH5fr8E%&tp_+#O=MJne^A7R(H`)0jWrg2lhwN zGiLo$Q~bUx1mwHp7Uy_BkbhZVfYUriJ;b+r-bVxs$4PqPW=D410`GWrv=ie6x7XEr zs(r}GP7}{06djtAqFOJ!Qkc`UgkQQOKze$*Ic*2frqL?bP$wVw_YVM-(S)FMu72GB zmE)kg+;Si((dX|`rC?!9BjZadAq`AYPky9lVqMc<1wKYW5lQb+r#db1{$2O!2Sbz^ zbdH47{1kY3KY82NZ?;h6$>1!v!)?O#mYXz>aLSXhTvRby&`k~SJfcrG9 zUxzkdd#C9dIcP+;Ltd4o6!=xz?~lxZhnI?t+K!LMUpuGg`+()i@uBzB+j!Q6*wEpK zcNYa{gX*6(h~**|MJ`;5>URYfC2$R7f@2=vJ^|q>7{3goA{2y~BENlLdb>fYTyZgB zJxZENF{)`=LXz)%r@>EwD_lp%!5OzJ&Aa>JGHWD*JmWGcSw$PG1~sNpRhb5F}PvV_~X#n zk5KQbu?xD3)^IG_lTCQZKpq0g>p@vlA||Dq-e$f7QXJrv4axhNeg|;9cr7T8Ym43r zb?io<35VT)UE@@S&(BqN+yD;j~N`1V(529jRu! zc?J^BirPm5J~=s?d_8@Sl2f&lP|`r^U#lLr9K9Q~alFkj_UQ^lMu3+*rWk1tjsV|u z@h?-$pRlqg+5H$uPaw|t%o0d8fj9@bXs>)%t|?FbDT+n%hdEzsd=PVmP>lVnX!e8k zcCh#xp**Q*D%oYR^7~-kN8{m1aJ6mH_ZI*jGALWJ**mBkC{|=Ajd2A!{s=iSPsLkZ zBKl4fCm;fJv1Y%|tAjK~YYC{;dzSo!GcZfhr)?^=K&LC(KzIPhDF!UON}$>1-WUr9 zDNgGJEl%`3yR|}>3pSMdR3XGc;CfCQKWScGtNQ=PfX1z8%t|BQ;^*8;?a)04Y^&kY zk3zFDH(Hw&=&*zRJ3Alp9X5Kjg5t;?1UR2vi=}an%1S zfN_hma~sK#6`z*mz8oDku>ic{Eo)cbM`V`nO3#TNPxu@*d{W0uCxFw<*XddTYA_o< zqkQebV8}>tHwG|hG!mr|%RgOzM`-?l1adK-A`n9exuzzTr>U{e~;8Rjy09imZX9zZ|ED|dQ3FwW^3-M^Kj zw%W|nK`^qT*AF2erWwL;Bx)PKuk z=)se$JG17Cs%Uu9X(~DVz171h+kM5%cR)%I zKS{p6^m(M#?l2$XFxv1!QH25*NHXVpcB`?LKV8+uV5Xp_vn!?kP7o#F=X7j89g5e{ zZi1{@ygcgzZq)piWY7vTNAr3kUiXRhdZIXFl=!vd5lPplCi3g6>J>V#BpjdhMm_-% z03g))*)MKTo}FyeMX4YX5&+_>GNWiP zKxMrXV)_$Rjcfh;uF=L}>FJCOBgAqvPXf|-s{d6ZT&rf}>ygSR?o^GQ?CiHYw&6yw zxl7n8_~sH#`^K)X2&5`0>q$p%_4RGg@JR`X;aJ0*eEh`PU4?V>j8^+1o&{UT3sN!) zAoC|M>J_Kns(NnEHL+0<)TbVxO>~gM|C7LNN6G-6Dsu^9jPN>nef7P_nJV$TCJ$q_ z;X(k2Z+#!R*P-M=XUTS-k+ttzgZ3WTFk5u;=Fz2d_e48UIMORv583!940ViYY*+bb z73y^iW4Xf&v@vhhQcCAFK=7V>9 z5c1Q|1AA?k*CSNBuzM!xLV$GzI31p~ero;W*l1SJ@#KSKDmZUtCb7bG0q03kF8RnP z*MGzpP?n}OW}b1P_fK`FaTV+b!>LyJ44g`8jlkn8g%BXV?3E8$2lRGW05N$H_zOul`|NLJ9zV`XL zUwznQs}HMtmb=vYMw=gf3y)lDbikwd>I-xhnjCQr4MnjCwA^h5R{~f|JT#WMcDE%` zaeCn%a%QA{LXeFcMF{kLSYl$I?u1V<7>(;rJBDwpTO?`405SGY|N4!S?8yuTLRQ*} zr)b|_z)c{^k&%!eEvnN%F$AZ+0-)=Z3$h3?MEFbRCI{`g3-Jv2W!0(Bgz@?DjKm~>)3%5pzh}u>l*r_cj)a@lu0J1hT2GIP(7rK8nL@@k(- z(hEv8@l245f0urD*Ba+m=Gv3A)UQKM!|m^(e9{pdjmgXIN~9>Taf8HXxB2^3zL$hu zpgdDyC3*Gj6r4{-`0b-v;4f65JcFAVdIFZCzyto~$=ZBEye7s75M+K!?eOpEuG5m5 z^gLb-(8{sVecMoJ0^q@9Z1G{`L?Fgwhy`}c<3pWER>(elhdWD}Z|Kuc0Jn*XO&&v$ zu%Aj4XbCCJQkU#5H6Xf5Yv*fnz6rFc+(B-c;B4}@(MuFltgHJEEdYS;^RcKlWA+Y0 zdccC(82y~;uiV*zrbjwfG=3U|TwcuX#8GM%frUEwd~0#OpG;~CFrw1K+hq*McRr`9 zMKKn>zx+h$Sdp({__wu-I6R%EY9nN=oq^}PGO6EIdM0+%6+KQCY;^re?U;AM&F=Y8}HiW^gj-Gg(pM2|SnVGIv16Wr3 zQjre*e628gPe&e47kO=?6fF4L{7!^{sUa~Ds=>)|bOGs-3IVN3ieKDU-si-p;1R^pcHBS-V0)u z;0eL$kr}tw81ZVMC8rO9dib~r&P*g8PlK0^_M-ebe6dQ4!`n7S$9qErQ)6en&g!M! z@UoPzSNAK9LI9vHMg-e1U4@Z6iO}*n8n?YJ5w$@6d%L#3X7nR`JkTe`9O4lnpe1#R z&9;w0`3@kj1Bq8qKVmd6xmb_GrWvjMa=mt=cv`4lwhJ3r|In`o9n#YUsn0}2k$;5L z#;#WA61~9Y{yxgd2IR4!<~td$r;J5wimu8D?F!FmT(Kzt;G|Y>Xe4GCUvZDrUh4;X z-nNp8)qWn)S>=DBE&}2IAg;G@ztBu*^G;d^czDZ<1O$6VPjHbM_aKs@y9bgb8u_p7 zWsAPLiXiuAH8}t~Yu(GsR^U0wZJP8T{LS>;Et|)rUA{nUJF?Ftd0`c5=sttzy?$r? zO-sJK^uD$08C562?}Nz_snp>N$4Y)$`>4(fwP>{IH9$20s9lzAzHdY2Hru|V$4?}n zRCm{>?P4h;>JK{g17Q9 zD(xg3R?(()S5qTL?YoS6`W?Up@!^Dt1S3auHNiOJbp8U&(yN7;X&)yR-3D+aLp7ZsHf`$}xt+!oy{m(WIlgvsdkwLu-9h;A34wL43OG3$nNgR33yC-&|V@&J+lo zz7Z?=K!0<-<#FHN1?t>?i2}4kfOs{?l2mWU_!HZyc04+npu%=1?XHmx`f(t(B^|3z z>A5CGxf3H~lkF+2mN7}3D|L2mzCJnkpNbDPMadKX%YFK60UCvzL5RN~%`8|`3b%4R zH~Rjj4@_fb;(6$0iBLQGRVQSyaN`ox4qPMwSM{a2) z&?6;}R}_l${(*vLM0*hw_B(5rm{_p=X$}u-Hq?53X_UT9k8xeU*pdpkdNazFL{@7%|T-y*d48sIa0gSc%Bk};zh zIA@ftH5**kTrU&|cIftLs@HJ+{aBWYz>M?i8&}%j>^!s*MM@@`SLXn7tOrUzQd=q? zj~Rw!0iBg1N47>Gr|F51 zlO_l6Ra#@-dz}G$efhQ_Y+lJ^$azg}%@%#|HY>q@inl$_HEsL8=aTd!>trO4UF%1( zw?CkshRNR!+9JG>9$E?L^di=)=TCr3qEbcDo4@o5Odz0iY zgosNz7C+z-Y`SDShGaMOk-!fUoZxRHTVg&TJv8uZ(8Wya4vzc*fzpDF{p~{LZvbEG zJo$SoRz+oiY=^XV{>)fC08`7L+!-r^=675RUpe@6u4Icz-#-Nf_u+meS^N!N=XCV( zMASVI{4a^3?egOzKV$TiJ%NliRmYxAq<$(fJBo9jpdn&H2|&;t*oY&qhdq8c&C#Xg zmC%>fPiXTC#pQbY*YYeUfOlXRzz_Kb4=Nc;;9O5Ah#+`r87$>01+2P?DT1LC1(Kxu z>4mM)w=$-bPCuLI~qx2M5qO zexAEkR90o-$tknu!&BXPJrNv|v-p5q%rdj3-YIAc5BeY{9t$D-kYz=;LK_d-=XK02 zXf({?wfWaTeo5;k#t1PNpcJ_ztQl_H?~Xq@e`zyUdBlbn7@)`3P=FljRQ+X6T5OOBf| z&K?_FJ)RT!wC5@}5Mg>}V~i1A2=Ij1NLNpS+Pl8K5llkh>HqrPLK%+Jsk>Vr1h3|> zL7VSL_(Kdd0H%-k z30khl#TazHEwuIpZ`T7#3u^hca%dF$`2X2^*R@GfRcjQo`u?wYSGa#DiU^9Q$gKG- z`ssQzPKt^M1H$+g5zc&qdN{ci442Q{qP04FyZ!uy0RM>A1HP!-Olaw2@OS*vTk}Xw z*kJ5yEg>JR=hsC23J`H1qw<9&RmqO2T2}zr0%7Adfc}Cg&=xF0HX4{2V8cVwIN27q zP!`6AHPTYfM@%=G7KIpic;ZJf)1sux&JTHjT&$M?ilO4Us0*qsB% z>H@X>(2gmxjFBfP5_-pk-8GLCVJV+7;fMo-d42R+B8C8i@=;^NDG$Ng*m{9YUh>=E zY$Mwa=iKg#H88_626{$9J_qjudjKS(iWV1oWJZ>IZBdN~<1} z6Fe#vS~#{3Txr)NNEAZ+!uyB0=_3#<^Q|}AeS=J=&^K~f z7}2R`to!6T&d;r^>uu>&LX_AjH@>kCz?`9A&tppT;Kx-tt9G+uCz$tYb#%YQi=}&> zGVf_FdpREIPO=AM{O&#bLQ*}aY8w(#5d6dZsQA*T?)R+PO4<`QZ3qtjpy^Fal&7sz zmg2+q?aQ9cJxTlO-3P2k-p{In=d35y!Q#Iv^B3@-B|BP!3vHCL`%Zzk5qA?bX6 zEnR3R%Zc#OSNp-mt3j3qms>`kvJO4qe9n@*=r-7`m0cYTcYy5}+O)(>FM z6D{ZvlJnK*VYLAB$`-vHShaZQTx{+;`tk{D|0q$zYXkCCn~1MBkGfKaa$~A5u;YhK znf#OR(aP-|+j~8{!fOiwT)?1DtZ@S@#*5XQAgkPQzxn$0nL_a1rD9`_G_JN5Oe6dC z(L{iEX6&bQz{I`QvjE9v8R(}`4c6Rll50X}y58$kSmi$glLK%DfO`@AN(-t~Up%3w zycsmwb3{8rk;{X6G07*bA~%d{0KKj1IcO(afZ7nV%3AG@sb^U~OaakX7CU=TtZK;q zd)rjY?dBGL0x28C^vS5-ETX87rO4dkd<2lr*+g5K>JN``g_VVT>XxD118s_8r~YI2 zvf~im$r}sIBQF~twbbt`uLIe>{UX(U9nPL!d|@m_7i zIiJIn?X$iD>L)Fk2*o(+CLML0fGOis0bhJ0V9v0_$N1i;LZVI&?AF;esTUNtlCr9i zV}>!!MQQ-HjcMx0jL*nGr*UuUfprO9sSI<_9YPSgXU+EI6pY_=+*=dIb4IQW92Ome z#T6e2P;brGd2};y!nqr*iM_z{NGjtrrnh=ZU(K>Cfg#;~gI~ZR48oWhodizX)nNo2 zIjd>uYM*fX?u<>>%wx4s(#I(YG~Bg$Iq@}##VtT(G$fnQ!Pbh;KiAsP-6K#;0W%kB z$@g{aU+vyrlH@yUPPcwm>H~M@9Qv^`t z+bo8Xp*zn`khE=fU-)^0ZrBo*4Qss|Ls|O0R8R z{C|eDH2@FEpyx%7-=+yYq8ybZ_kV#b+hLCX_&h81lD@C7CnLzblGv)%Bg?aqa?srz zhaKCCw{(iO*--jjd;aw;p!>n(xiU^HLOW$-&_XesT;(z&SW~zbAnW37(E!`&k8fwM ztrM0N+)14mhhHYtbVa;^n1Une6%)tzr!5*~Cw?OscY;Pn*sM&Cv!H*sm(Go$37doE zWUlI@+j8eNV7@f0zbj2d_l^FXeM`p+#@;L7_@%7cd=2{YFx26OF3brj2lQi42mCU< zzrG2V(gfMQ)1PlU^O`$qIe{lD-3j94`v(E(_+399*$206ISLGE=T0QQ$~xxD61-7g z8^zojR`!*6qkmEMMwrAml6`(SEf;COZKp%zoqnR&T1vLey zZ={aCrJ0tDbWa?g2QYoxFwVgbzsNF^K<|_Rh01WDqR&iLE$gBiz(#!m9yRO4xMxti z=?{OO(i=Gd_Y_`FS>*aeKUP3#x`yEcgS?fgjB}0h-u4qg@e^SSsX8|SBn<}_=aUwg@{lza<8kbua|jU9y0rV)VAW)~pcP zxeTUR9Cm}}O%8pI6rp}lx2H6_+7*yvE=NcW{JJSbXM7KC7HdPp7|6XU^Y5wER@9H=AW4tlN<%U-)~2e$@wmlI2Gvn#ff}M z$uY{BE^ z9%k&kH9xI4&Me+e*Bt{Jy7HW*UtRQPh<0arC)4&0HgD6P!Au1z>R_p?%sKqny7J=eFHdqC!?`HYD0JoH5;tdO2w4bq{V z;iv8YBG3Wb;F%U|?j8So6x*MJc-kGOWtJ~l*SZfa_*ZG;Iup%$pJeE%WV!Y)EgAC2 zv1cr3jn27BRX=|c+H$_*NrpI`vt{3<8T%!V2@ib!kCRtstNTKIUap-|ws(Ee>a*~n z=(m&O<4Hb}?HJBqp%-}q{0{A74tomwjW=>M+6ja-=bPgIpCnOP?*a(n`*wth2k zlv7!mII5#%VHZDSvz5ex_ju~rAf9`7sF&!bCe%CwT?w8LZV?p3PpT_Pdj1B=cjjvl ze}92I_711Fu^wB7eyJC|lq?bifE@VTw^DBTslCLwxv}T=5I`Ss@bMMx$&Vv|yjK3s zbpWvibPzwt4UdileRHv>wzaKU5W+)miTDOc9R?0WVx2ec;mOMGS)pviOJ`wFHz#e; zl?F@=#KM$Z)`oUqePtUXt00!ywjLRsMa|5M5{(-zp36$97|6&iHfM1mls8ZU`nZ@J zGL`&eLj1+IgrWlaZ+eB`eEf+zae&l0(s%F;^p!AB?EqiYQ3euUAbF! zNnD8AjCiv=HK4-GoPNRB`*!eD|iFDC1b(>q$O9ac+5qGVBx1gUWKyr>mC_Ij49QB>{hW=BOS7 zYsRd{k9Uzw_euNUjhXq5d)ES+LADapJaPmCNAua6RMYF6_T;cU@k49O8-U`t}O~R8IZ}40{a$vrnVf z-;)iG+)V4x3VsUm6kQlT+gvjGR1IR&x%l0LJoc;W!L4;9fNpnn?Waz#zDteL7_B5D zeP7QhE12@lK&FLNp~Ay;o>G>c^hNRiW-usgroIM)QS2PuHqt5{R(Fj~#zk16TTODshz4?VlC*ilcSP&?)4xW#JyC4a zs88wMQE6po)sQDaxmMlz>=~pXge8y3#zGNVeyw@nPwj8|lq-ir&c`Tr(xVap#+siG z10eX~3YBr-=Q=Z%_94TZC*yfI{;8Z80uK5W*oMYeXq&y z$oSWvH9!F<#>&UIzQXTJ86US%K=)0oe-pH#6RjZdTtVCb2EgXczQkR%mXp2>)qS%6 zHPE3ldUzEOt&0zkm0`=9hmQ1(gRFVmORP$FsHbv|W6^IpvDhisE*&gE0k{5X*PwV> z+X`HnGg$r6ZNy8o=Ms2H>7PI~J$YP1c-TDZ&*#~-Ay+AmWn1alCyc*w+Varf0^9-| z<@|R8HG@9j!GhY?Sz8xo$eJJdd==o)?NpB*sp|Uz*rdstvY}_M1o&ke%pwHPjpFPm zBHa2!M2+N75(P$m4J9>n)L*@%B)UFYv*dbR3NhA%(_3UGu|Kyxv_C7a(2e6xBt<1!yS`eM3PpN11*H5ba-Ufsji zD{a1A*L}2nRJh!Ydg?^a2>zxWPy!^(?A|tuD->abHr*#{dNxkv0eudQoegelpIlK( zfHL!HaG6stkk`BKgj@#k7vR3#ZxV*OS1YVd+-mr6#l-XX&2D=o9vbUbQq&InygeLh z?C-ACXC*Q8?lpZPRbR8;;8|+<9HYAaB>O;{qaC5zB+GXDm*^xe(;I&aqihmUF5yI{ zsXNvQZ}2yT`bH)wD@g^L-II4FCLG9ITWX&I(f6r7%U_<-&qA+id+UuM7+V!*>#c1m|iu;m4yc7a_UxcyhMJv16EW+Uo>^(UzWDEUITHfC+% z{*o+kZFODt%&ppZnK9s%ve>*<>zIvFcgQnB(lE0C->Vc?tH=-ZO)VBrG3k^6r2`-9 zbRfAn=62E2ZP@cOYgp3`Vb<|H_BZ8=JB#jn zgtv_s6&dRXwdH4od|{Vw5%Eo7YE8F#!?VjgsQO%)0ioF8o?wXOH?0HIe&Tgnc*(bX z0c(uw#2n1YEZ?M9JzqxvtohViGpts4aQVoG?T_!!vJY^O)MPj#9&wvAf8cf;<92e= z=`t;!saNN>=dnerW4jP#0n!2tR!_(0^ql;Tx4+!-nboR1!*4D$7XwYd)N=UG-QMu% z$eur72Y?0WKwzC$k<)K`5+Rfii#WYqgd|m<2C^*Yp$AMZPYedIt(Nr`z%0Sss;8>>Koi^zCP4j0R{3q?D7TZ^p8J58J^!|OR?>q$ zvB2aTbE0Q(VftqrK(HLC7JxrZBb{c^$j}_~x(*f9bw-!0oRV3GbCbF;z?6Hsve#K0 zrNKID!1TvzJy77g67baU=cx({l}?#%@S|eb4jMZ9%p=g|?m*{n70! z2>E-eZ-R?;uY8gX9Dwh(-~p6|papaK)>r*~YBzo^?f>Z7S^i~{nmT-lH8mO-aVqLJjwrheS8N{t{?a=m3{wc zw%*(JT1NIxmMzw`vv_z-ZzQt(Bq7tEi}oRPT_t0=cnu-(uGjQtGT*UO)AFahDBlWF z%SCIGw)X&xk)jzJM%#5r@=$hNGy}kNe+JT0`$HIQVi~IKq$J?l8VvyStu27@1g0`p zv*o0s*i{(X8!|hA<&!j5KL_GF^g)1U4_uq33q@CsGL)@Ccgk5ItN*SpFgZArYh(3a z_+U8$)S8UZSAd7M?)GARXab+kVfpslm$WNSPbiBy(G90c>djp}`pr=wkb>sg+ra_~ z#^qyq&kJi*mby@L5P%MmSt#^rh%wC?|1pwfO+o$hPZ@kiG z&;a4d*3k#;tvgo&zc+%#Gcc^D?pFfZ2Z`G*Jw1@|R?yePbL*n4fm!V7&y&_51b*uW zX11}vJx1R0z5dA0P={H*CeM(Sz`ItOuP#qO{GS?^3siZx)pAq!SDF6VGo7H9vuBf{=Wz@vF6VeYxb`o0|sp1HiF{9Pi7)*C$lqa&!)_GeiU8X8;7=@AS}@Tf4*Hhgh0ihRfr;Lmb30T-wI7I)&n(xDNoQ0FYqhYN zyqU7MXm+j8vbTH2C(WJM|4xJCpn?q{n1e65895JQIU@t-Q%#BZTv~BL$gL}_Og2Dh z>!9xE>!qcCwfRQJ4*(!N7c0vASZ(uWc=z8JY_-G8Jmj+0&It|dMfG}~zexvw*l)m4 z@n|)t2Sz6bDqgDoV%%7LUBAIZuyEcu589qI=zZL_p&8I~l`z?RwOkbYFUol9B=vNf z2V6A+5}>(%g)2WvgCivQw`H^H0dBC|l7q^Intb#CfF1R^Vx$}bfW8SKx&5Dts!lk@ zODVC)@U zf3#LRY~`RiR0BS^E?d*rGeor%KBH|0ZhwY=a^$kAQEgzUTFA9Ne|4y`19_MXuaC^fRu@6U>!wEyBc!XC*_D0c?< zg{_JK^fkt1v-0~V>!UiX`g^?15usx3{K(!9`M~L)Z&`Y$0*ws@A&%7tuszj%hTr>w z3prZPY=2%lsm7~?5{m~r5Rmol;SC6>Q3emt~E zMJC=%kj4U?T|pQ=-syMVaCcf6D|xe7a1ov4e*0whn?$qfT-ZUvr@VAMCulbUcs^D1zT zdcNX^D|=>hxwU)^c&%&lsTPln=y@h#XHef&+*oi&fc zgX;VapIFXcU+K~Dx~t^l zkpldD(>}z|=vrRCxBLP;g>1uWvam{{668ur67iKyJ-Ix6qkdVjv-_u$m5nzZGg!gO zT?G=m>#o|yovq^5sr}md8t6T5LnOVOkH(;G`@CUE_2gl}pFT+v$LR*(u(nTP?lRlW zq%pJGHFC%g#NF)p=bhdl3r`9G;FI|N(Ay;tz}&Hm^}&_z%N}yCoAblq|4hZa)gztp zF)p1*)E;Hq+~+D+@LA z5xKwk>-g;oai7;4TgdojS5|BbgLab`Z;k#*_m{BlACUZ&azY3IpHK47f>@twp3G06 zSn(#h&O8B2r)!^*$@nJn9cB@p7*MV5>67>@>9(dUoK^u~%RxNl@SFrwWmbS^an~~N zPGvD|WjzM~3fO7^(D?!ZqRrZ`QsmqbFI+IYcMcC#?scu8EJbR$s zDP5@5?FHIt8;hEcJ?C;JussdcP4|~(Bw78kF}DG-r%@Xq{aS9yYHL_U`d|!F#p@q4 z&*CI&n36hH4E&Y3P5OVg31i*T&S|S0fTHuOYuvb2>go2Gbn?aJ-a0rJRHWXV`&Rag z%gfJFwteG4Wq0bpvwx1<0NI*4oQWTqu-G?ml9Wuj2ClBRJ>ZNxs-x#->scw|dvqSm zuXSLlc0!XHuVgEc&_N4+4@EpR~%KPH;4F zZEhoI+qg-)Dc>#df^wlVhMokF;TsyW!26jI04Q&9q{nZ% zasVy4gA(HnwXxOc9H>L zb4iq^oZBTep}KSKH1&eJGj+}f+8j2_gv>X(cC)|SzVBu|jZe{mTjepgg+2DqDp`Gd zy3cn=tN$&2WFY($)qdU?&C~Ot{#U3QPcZ_b^7jgj)`x&leL4>S;K6oW+;v?xT?$k2SNZX3+<%K9O9C6Fh!EUy#2ghgCwB*5-x%<@@z9!yStb zfAhOwmOfAoM#iJo6HOrTlEKr|+c{V1i$lph)$^e1TjD_m7DsD=eNW#p_c-oW*&&qB z=;zSf>-DMTz$0jHO?p=Xn<~@5X#eZlMyYVr8a;t$p=un-(OsGaN3`s6&0yUIlqf+U zBt!PH;%XfF!F_$23-oCA>YMb=_b+ShTh{hZnl~XkL`~M~0Ub!|!Z*M1*^nV7y>)4r ztj4IfYTYIc1fvy&>`VXv^G&hEdH~M1(eth+f_EOx>4qt~ShPu|4ZhCEEP&46(tHab zQ|0bfbhxRAZv}^L!($XAs{76cZz?|`0YLHDl&s_8=HDQhsGj@KVK5|EtV~OkQ&be< z6&nr(yfEiSep0(8=~m?f3BF=xtQ1&LI=|5aeHx9GX4g*3)GSjM>4aRi7Cd=dbltG{+dD*<9A=b}EkCTsNusphE# zE)hQ9`@Ryg|7|c|%H0#j-}@lyad4t9xFJ||GJSviGfJGW$9i7Buj$d_zhtNI2UUWsu>wj6Y&x-QIa&G zE|dC1Cb5xj*Pz{9szA2Ga<1Vd7WkO;8Jlc;O{;DD^dS*4vw@X|=}C7obL}%whpf!E z8M2bHLeO?mvTKf0Bepxb^OzG}d;ESoh&CHI8`-zoK^u<~^FH^p}Hy!X|%iSOJdb>Ir7 zH&gdHY66$u=ah55gpv?hw&x5E>t^t$cEBut0H@$u+_la?(DWui? zBs+`6^ECXQ9v;uJHo2-EBNV>En2KFf?%#R?ctqzxbn4o+gYBS=P>dbyYn9L4z)l0S zA}XqSjW0*-bT@yJ7&G~#>!fzf#U3&hE-jDPoe4n1G~oAQu^dH zXejw59Th+fzak!yp?>*Nwq0#XlT*_lC*;j?zUcRGK680Vpn?=D6XY3r-%1&tEUN|x zVG9z!Kg65!eXjQIkkeA%=fUZ8lnU#>NCh~(PZf;Y2!1^S@;vR8CHh_JZFa%bN4Kd3 zQa?!^)1d(IMl>rwc|HJ>gNbLi>V`7^R!Hhm9t73^6PIDGT~E(?cdQuNWBgumO!%yt zjnOTR`a(}uo95vFO*vG9>)Sl#wUqy>)zXgLl6DUqjvz^bJmg z+>U@dFPPeJ_$naSjyH;HzX?<9(i*V1)Ds=h^t4?S#fF1^WrV9B8r_Tax6CYHdO8?^ z*}SB~s{u&0Z#&O5^Sg!s%rf&msjrIpMS-)pty|3Y7y2TUXUk(V_C(y?y9RiOV_VO} z@uCqZ^L-gJ$OSJJpp_~7t6T;1x9FJPpPxr|F5@>?5)tajAj+t1`*NeTMqqoZJah`= ziY$!g-pu;Z+(r1pV6wioK51;+#5%NkITaq_5n`(!iLai_Y8cQ8XznGoALTg%pOABK zil1tDS}tbS1P{(JLp@)_W&JE*HND^Kq>ZXxch}eBdXKA2`CD1bsO(a){fG#J-v-MtRV$d|r+>vSBuMn0ePbd1(Hxw3AP|2iP}QJNoU}}31_ax2jLt?>n*)wR^{1-E$?Bj_=m2Iw znZGVxYPIQEe_mp{CR%HwRffmr<0Wc9tNGl9PLa`Hdm6V%s>XeXR1V{tXBg^d)%JtKgW~ec(0FkS}pAy`t9+( zPtxT$VkcF)ngIX3?qdHQ0ctxj*Vss+d;6hiB&E_eO!_ryBp9X|=~%Cct57}XyD za>wUw)f78>JIk3BNP$>Sfb1M_M04D_cA)q~oaNKgRsH4?XqwBnS490$ph!2jG`^!F zgQ`HXEPt?CJ2l_rL?-`lk(FjxXxEpvK(uJLIdpzcFXd|}{uUlaWty}7i)*M?=6e9L z2%xF)AK~mQ)A=w3`C!P=h z#p=_u*|bC&Eg1ZU-#}8E`NdiuiPz_O4)K#GkA6uKw-+2Z2V(!tvsKxk4~KA;imy3- z-WPbgOV;?U2D8*1@;mnNyv^^^sk3CsfG7EK1~2{=uA=p`72y5_vXhBt%Q?i5qY^ID z(UzX?%aVllTfl{e!O!~X8fo^)sN8Sr&0RY}d%h>*S@%rHgT~!MS1QLhIJ}25XEJ16_I*o_DNksjc`Z9o7aTm~FI&-#Hjwyj; zUr2+lcYicr2XJg|*ga)MM*C~u2UHhmGK)uCD3hIE1IX7Kpm`^W1Lmge&A>#~>!G;> z0LolJe#bdE()!aIgphQjx9l%8ewV7i>6du{fHI{5WPMY{(UzGO;FWHz;b^mx-zGDo z%{moEV3-b^-k@8V{GL+J)y-w597o`b@q}nDdB5g#w$$sZ@A6D*y+xsdt~0cd zTYb*5H?2Cl?;anQow>C&gSF|O9>B}*r*pSt|4i9rx6TDMJat#{$#t|ib%SOAyBp7I zzWw>3tIn5$rMQxBBBecPreZ^81KaXhh|)SDC0z73U6(5r3?fQ^_< z+rP!9wHoU3iN6gRtsWk-f||23S2S4sm6HS!av+%R&SVD$=!i$8_^CxO13aVhEqj+wIGLiAJmZJ=>*c?M14fT(%nL zU7@(&O3$#M`stTNv||g0v%vpf^MS4>O+YO}zPi2_JpHxtIZfYg-%Jwj9KAo^^4z&r z!*^&kDF0gG(&ai%$&BUO@$(N5u9m(@JW(}YA7^Ox-TmVM;OzXwU5g+T_%QE%Kf6+Yv+5HKZ4Wp>sVjYbh zz>@TneD3NEr_G6Cfp)*-jOOf1h^W|2Od*nAU;R=)agv#bEw47P+-?UHjQdz!a2^m} zCeqsqFbx1zznBldNH@TUp`IHg)Y)0`;3$2q7mwL@3Ln}zKXqYv_}UhTPU3GU0DO0j zwlX#sX!X*HE(%SMbKb@y+tuD3RJZ$niR`2rDMh_tzpq_ta)Q0|949U(OERte*8uo$vXLCECRW!91NY1f0}lhUh%%Inc9l&?pYrVab%PDMxawGsaN_N zZ@JZdO!6Rfw>Iy7%nsnxOC;PI&-JwK+83$I2sxW0@h3j@)zc#Zc^kQ5o1O>_rWTbYUrot#WyYEj zb2iMZSh`<& z;~X2^{i{hQ{|m%NiFf}ud$|BS0QDPaYh@|MhY|{zDwWNHPvUdJUL3fBmdXdQn}6rdWTEILRZ9d1@L^7*BSdk@xq;!#22(69RNt1 zunPDDzK)E(wb!Sce#MF$ssWFg0+5`=4`5E7NQ&XI1MUg_dV);5G_%8q=4Wc>edGl= z->29vmiR8^-We_Wnto;R%D_&k0rzbl>qS5I)j}zaEMZg5Rs92PI6AQZ69a%)K2gNa zq0)wLt*zEPJxyAB`*ockyIy^kZ0`myXP-Z<2fi&|8l6gP9Mf9D$^X$gvc~wA?_r*7R z(>PN43FEQUQN}ut!4sXVc>E~O==y?HZf}ziBDaW`_q~@vU=MkfEx(sAXF5WR+lYiu z>m#D_tFFHWeJn*Tb&5OLKrc)M=CwNcUrk4oF5}04Igepsi__G%?RRQQNj31#Yj}oz z*bSr=7S!{nh%%t7z)xzl?5{XnpU#lgPsIC-x4!5e<=Vr>S@y$;_G|j7S>vfs5R?9h zzcDlOD9mt&VKQsfSabPSE}jGu&%IM@@p5v^N;u!tcRFXI8h8=;?nkuegT;PRYf%Ek zGi$rXr6qHxWHFnKh&hQ7c}E;h60;~;6M{FmflFIoSnbJ3VL2)t%d=|hEn*biHm~SL!>2~i*=`wZ-skV80q+;tDSrh3Bn+R1 zp>?4pYz>oh7eWB|lrad8Ei3YO!_ARs*W0Mbrz*vhx$OIxGV`SEGD z*erbmHAVvrL+G)*NUh$Dbw7{2o?}oj5dh&Rwt6Fo^E&a>P1a-kZ&WlraraYVZRxR} zG@+{BL#93`_EU`)gh0M6LcqUNcu8U*_pjpeRYs3Tje6qeec@sXzP2Y4UVHu6bY@xwG-vxRdx7=V(*{#okC1-~M!AGMr>Pqqy0WfGVrldSDa%C2ytP4Ynu3Xp#Qh|x5svs6lXu9{mg1l>!)S2HNo-$_4Hs>M)o(yj?+CS zJ^B#5Ws-jhBAj$s5mB8>oDb`GmTrJ_vEZbqPZZ^C#`bPw#C_P-V+@y@$lJ8^V(nYYU5hmdjayK}`)t2j)0 zxIG0OS>2?s`<&Tskvi~eEU9#|?{oWx$$7s|vpu5SUt;Te@SPv;kT;=aro2(Y%&*f) zEI}UsN7?lN5dETXE*R&1HZW(*^TZray2Go2+!Lkpa`?_$Bi^j+h8b{iw7?@GJQMwC z(dmV!WY@(EF)c9i3TfE&5*YANq7SU_NiRhO4{`6isl&vF?S4WR|*WOtP;&?}pI#hZ( z^K!s`lWmPbs?f;#K54*YpYk@YjLBY-)QDHr!R>I^dyeYg=^yrfOJ?R8P`s{kUBu;R ze~tVe&CMx>_E$(IxgE6QW%BdC3$8H1<8SRDC;;D*BdC(r zNA!YcyOT>9^R5lrT$9?fep_bLn94^=Wq+zAkwxDEOgT{jYS-8k^wE-MRsx9{sqamu z#dJzvIKd+gAnk#XnEnZQPEPnH%X6=1&9b?mzCI3+=hniU8G*fgHx^E0AG|@@eC!>^ zKu|g_`XpHWq@LC!QuA~C{qU`zaPc4dI<87mYM$3;=ooFWb~w@ImbBx4GkCD0ACC~j zY+74|5+iCGxwVf?OZNuHZ7mCZrlOcE=o`h{_RClK>y>lN_e5xH6Vev}>u<#KV1G55 z<^J#u}*BIG8 zi$AUG|C*Db+DROh$M`Hm;8q0O)cgwirx zZ$fmIsxeD$$xvhOb39|nuw}rNJ?$V$$9Ek;e(?+kH zO~*P;cbr?ZWv{Hwe@z$3wNP6dyX&RXWNe)FP2F10x0;C?c0aB4Nue~?Pt~MB<^Fm` zT=@FDXA=PQ?USag!8kYmhvwHKD+dLC^n89UG)46I_!V%xr9NN!hO*4Iww_y^8|ikw z^G(E7#hL=1xghmR9OS^pa8y!AhIX~;51?&sKJB`kf+6|@O z{Uh1VTT2YQ^3kaO01%W8I&Nv0wrr>tdL1YHFq=@>R9q6} zE~F%{z)s=_M-_b7;Hmsw)%}lCuaCFp!eQMwN1>?;py8#gZ{y=Yylxy5bu5U}lY~P*st75-V z+2uT8yEo@WFA?nxtYj`B@7=o3)KSJ3AWkD5;(yoPV!>`Kv+*Alp zdK_83Ghhh6ugzNg08qA~QcP$!W)hkL0r3MN{LR6xEMSm?ZGy*{_VD|s1O(Z(s_C&O zo#*Fzd}$d8yO}XL1D*Sv1`jiVUr!c~+75={_Uy%64-~)v(FkXU4^*-i;#=s=ZH%AK z=Tq~QD+YkT#*oGQW)1c$2GR#vpF}7QL(vD+E&#TaK8n7e{s{;WB={5nun%?&WrfWL z(lMK_$hB3FKA`lRlfZi(Hv&$icLRmu zcn+HN5!t-Fl02mo1GK(x+Z9^!fLQCF=V>x&Pf^!4%I(G_86f+#S_j4BC9xeVIpJk! zJZrx_q|Y~+r+0u4L_9B~;4e}&_o|b%&o@IuP?-6*Lw#+?p{DO$2?&7!X;SV&$o4RO z_7yRH;-;6SPP957<+^!djT}+q|B+3Q-Hha?g#aPH<@mG#VrAaB`+)l)Y%u;vL%2&H zVPf)kisedR7-65XUU|$cdH?_*07*naRF}dqKT_PxzYzB|`Y<^{dNNu%isLL32zvVU zCzHJfl=&@2Z&zhx02%_&=hwI;8&$5N7t8|bK{v}4JsNtDeee%_K*1OANeYZr8kp>% zJx_)t0(M?(qe@)r4*?m`mCxznF$D1jPjq~3J?)&w{?$ga?#dhl=(po`aIC*m*GH|} z;>S8~>Imgje15P=G_rd`IT7pN*bA?hFgjk)L~<2$=5yi&0pO!xD&B-FjdtwBURl*~ znp=%u((t@ezmEAecfAz+B_1TMWz~+*s?8pGePqtlE`<=HO<>r4Bi`I3@H`761Sq@R zam+Kig~H|~e2-Tn)`H^SkiAysa@kd})G>>NY5aeij@VR+AI^XG+NxgR&jV!p`=tFh zlMv~#J+0W1cbuiZI4K{iW&PK?7y(027f{}iF0j8zt3k&*lTQRed6sO5$2}HL7+-HJ zZnSk1(W&uN+h5zS%QOO0EPm9oz-OLh`4YkE#8!HYKC!Z^&ddm5C zskYGre4zfcL~F-tW7Gox-|Ht->>RIGYn7|zY=hxFFBzLEL?CQFKV zbS36W_kD9rQdIW%x8U?@h(_!9DDg@otp&X&__aCw&G(j?cdlvkzz*!L(@FsE4Sn$o zIw=4fhY+&%{yt}Y*;K=y83r@9O5fz+HhJcv7c={b0UXdbY`NZ?`>V;6n?=oTY5mrJ z-+t{83sN1VVEkS!t5-&&XBHD+R^mjf^vxs{Fa4*2lqo9~*@ebo7IfOV$!|&+0q7Mf z4xH8wI~XX>e0Wur1^q7~L^) z2yRa9Mp0ri6ocPDya}Kd@PUlh$+~jmP&-*gRS>bfk+l#E)4n}>l9n=Y#XLWjhwv%aF zmpUQyPF_w>bmGqjteRvB;3^ZVdD!Jm0jEzB|4!}Oe(%U$ouyOu?QL8WKySObm7=#y zX>_EMcD{R$qSVSh)e>MRAgsL&u|uV9?ac&7*;xFDYfhfSZ@)2bTZk@HM>lB}G~caj zt!(Y7xv|c3bRgGv^z;WHJaz_qXnr*04MzV54G1dvYX!qn#QzPuVPNv(#I5{ ztLzeR&yP(8;Es~P_pEQNbz1gOm3pdnSxvly-*yP|pN9=;@%5Z*ekQew)OvbOis@sxqea@S`xS8I4>(NNX)chdadjNL1{O?7f9w8V#?<7Y44(%HdRkCBKz5eZ&8mU~|^QEghIFAn7yj$*Kvh665>84HV zE&sn_>#+wGl<1Ad&^Dl-#Q-U%7Cd%^%If7q7Fh zU!cG2K1QQ9a%g7*xsaOjp#tMS9wvK44RJ{Sl%w38h=ls z-OBvb>Odcp<{v67Z`1)Hmn5$LV_5iX?#U#5Za^go{uH?`gE7b^gm*r@*a z+iBG;X?^}}dN;92N|?6W#o-zcuHh$G4HuFCxV*oSaCIeK1kV0dadf6{b7oqxh->

|O^LtfB&6ts>>#byq9{s0He9lUnrc+EkF$+7jc@vd?%+cMpFYi~%KHb21O#TvOmSbk%ysJ?d? zl(T6EP_C5Cp#Nl9Cz2|(OvM@u(-+I= zvm_8<{ySO(clhB44=|t{^?vl#dq4>#;-%!dtgLI+ab?gL@}%jA#hI{8yK9pt`%ep) z_vxb;WG@-;+;mdLzPi;3!noQU>~AogUIYGLqu5_9{1Wg<4k-IH%3vzwHE?v_s{qS{ zEN0Qck~j!3XwSr2C}lkaz)Ro$9g*56%9Ng+P8KLz-^A*X<)`)SeUGH#?Mo`YRxH`pcHN`hxb1gC|Qi5E1yE8rogGgjP=ixR2_FX5U)+wTf>QAjEYV zOYpZhCu}(&a4}Ri)d?cIOMZvFJ1zsiZB!uwm z7EJYyr{w$gIuuw|);H|TU!bW((=YXrjRU+FP#M02$N)Guq%2=_&ei0d`ZUO z!`)_0x7GzV_I;NJG(HRQWB&SS@{GyNx*MJEe2za~$xLV6Q}5^ZDCc_87>wT_5=1rs zVTV@d=6@O>*cj<_k(ZB*c@}^Hp4JR&3QGz>_y|5=JPE0s(K!!)r9UG06h0v%J<(w6 zIh1slZjh~HIq>KC@4dwVvvv9x9(RtXt7Iiuy34P}pj{32=Q_keb{rTYH_AAP+pTft z{sVvq0L#+S8v9S>K)HDYfJdC*PMXKrdC)hvWO?#@;a{mo^=y;Dgyna+Rs-&KAOo9$ zxbZdv0#;6!rZZRNjvPfgsDQx$O+7^O0q0t$@pG~q2>|pAM7@>*kliG$^tBpoy*q`FXQDAGKLG;Z2Wz)J)UvJCwHV0$i=}K@D;|X736Z(~D)#=?V>TAzpbQI@(K!-vTA)B4F} zEJPjPN|rfDR*%TFriUpte6j$!tR*DHE$x(9$~eVh0U*P`42 zjqg+z6|FV^lDd2!y@c_k=QSLlF2XdqF_#{tHpw35>95bOK_!v)2EN*Cb325g~l&y6#(-=SN>lme)O& zSzVXaXRU=gPnONBVN16XZkjTk_ROcbwe{*~6*4rLcuucpqzAjfGV@Byh5CGNU18^N zz{iMsctVe#mGX%^F@Ym^fW$?1ba_ZAg80e5HO;tc_uVJ`Lr}Kwd~e%(%SH;|?>BXx zhER=hwj1F z;(F!Hf*+PMK6<{?V_)k(=XdUZg*^Sz4c=<^8};-*S|Qb^;yW9=*|6^c>O# zu%GCM7F=nsk_~k__?v6#I6;(P;iX<;fKqXvuZep9*T}0I`~YAWb@%JEum9%i0^oCq z&ZLA3v7Yc?dAD50Jtu8|GB2Ae@bwwP>`dd5YrMDCsg6(ucKKbatna7wK$%m?176a= zkJA;yntoJ47@8ML%hWR&>C+&W+zMCnJ8PjEb)kNs04Y zjN{wb0w>Myj{GS4;*cFROR|4@0keN$UId=GV3>RB?f4xJ{J!3Aj)lwB@YsY6mPJ57D2Ak$syaX;$0SCS6cJa9ItL)w%2^5@Cm z8__<$YlK|a%|AW;L^m;|S5xZG=Xol?`Y8RHJqpe>q4V7M#`YB1Fd^-9K__o@kIZnC z=V$7jPJBxCij3Kub{f4zZ*#@ok8_hUEpOA;{29e$d~+&ViIJx$RJLO6EKx|12TDkW z`I|;t8SLVCw{Jt>rB)V6`rnro&7qmPPYwVQ++<9L)W=@jYkiIRC>5|;C;Y@I8q6bU z16ql{bnTSiWzh&6SMAtxv0LVfz5R6RlfDa`MUm9 z1AzM0ThC9isMluxo|ma`jq>C6F5I)9*v(++L!k*5x-%PS}yj7>Pi?#Ab_uL?!xK!yii9bQe zMwiaxy|=iy&nDkSs@IkEHR}YAE~@5E2j_i>X8Ov@rKY9-X!j}W=&iAH*+e}%i9gRU z_zJrg{w0s`_joGRen$?pL_sgPWkSRDrfTvNm!Vt9HK*}tqG|`4K)!Teukyg$ze2X} zd%7Mi;5;{8a*TIJTk_%3MYveANZeSJ*F1;9+Aa<5H-M|f9*StR3cRmey);w~$yp6S zdE*Bn z;(F!{^YqqRm}ihNaqVrpT%}izI(z&go$mJxEGvBbjib?azEoi6YQZ(*Ap<5}&GM>b zjyr{3@XPDU(!!jc`tek--onQXn!97AY^}lrjQ^9wAkjPqejVj`J4PGZ6FNSwbF^h) zt_^Ci^1KPGzRhBSH$EEMO5XxA^o1vIcF4?ll`qB%tkmt>y0{`yiKoqtgY$-Mvr7#g zV=UlwPql6#gfI_Q%F+Yu2D?eG(HO7wdBqn3e4w?9Zvbmwf~%nFvs+A16&;^IBMa2L zO%jmu__guDae3RI0V~gjd}ts(dIFn~5qa_2y{VA{tx*UQgURP4_^!l@dMUJpH1@B<;SC zo(d9^#ZK3 zbUfDdMH=~Y>ii|Yao;LKRtxW)ADW{Ko6%LZfBl$vE$* zAA>lyexFd5Yd|5UaTR?vSxj&7k^T5K0CVd3;ah7iT~q=m@tbNM*b;TGP6^WMZXuiR9`fUn&3rx%CL3WR7) z>l9jVH+;*e^JMxV#?KPu)+JU?e^0JQBj7-e=Lp!9S#vW)^V<83?^&|==56eOc~YNR zZz3F%IgDVgs0BiJ@;B#HEgH@mp0uT4Z(Ka}_2#5@?k!MDB{r4>vVDuZ{ZPy2cs=Ra zvn!7LmQA?)q>~Wy7D~0%>#KQo8olTEt%n~xZ#QVqnD;5HAe~PgAJXx+<~4$9j-IcC zk(|F(va;cyT4VE;JtOUxcCN#4>deT#)+g$HiKp)*3@J1*9M;(Nd`+G~&+pgn%VQQ2 zV-Z`1@Pzbxe!g4$#u|*qPq;EO*hlwX)VYaCj^0691k%|M{Q`u{?a&s??9ZJW2|r%) zZl#UkrQnR0A}|2e=m)||;&-Mkf6&W&0P>}!tKZtEZ;v5gBQPC58GzlJ6C9J{$J%|I zAI_KjEqMn3_^aRte=f_FhEa`@@2WL2^{sEb`HKeDw}I)ppHAbXvK@bo`%FHlf1sd6 zC-^u;v@{dtz7rGMS3iHK{Qjm6_t1>I+>o!49rnw8*HF-2Fl_x=%YXQ-magfb@~j-! zJ3C8w=$ig;m3v@U4K3cG#6ARbW^u9{@0?!$2C!79{5-%=#>@$$7z*9SBzrqRnW$a> zbe42upMHk=FI{hb$BqjLshJI)Ss?k!ga{$TH-VAb!ax!v5l_Zm(s>UC_&_L5Uw#CW z!L;b)c_@wb2pp;U=)l^x96aV_SodVdCN@qwAAOorLNUx-cibn`_25GtocKdl6S6sW zc!()b7m{odkoXC0KzdpEhk6e7yr)JFK^f2IdD50|@%Yx(nqIz$r0P|)AjpYRmnRJy z(k-HtMI$Z*CRq9BK35UQTr3rYe8qa!4E{m_XP|7y zw*p*STEj2LMJ@_{>N8IAIT&x7Xq743JPY{bI~cB$Wd#5NmYzUWC!hTu_DGk`uJNnE zjA)Y7JH1qVOqJ%Utmsswt~X)F$?2a+dxM;nsmVQ^<5(tR;AWetkFWG?u(D9u&N%T$ zzEbqpXL?QPCjIbhWL_NWKZ_#>G#74R3vx^ko= zZ9pd;H~PxBzn9R|9bpPQ&~s_s|G*e@-=)A{;i4G348$qW7)1Z~J^|D%`(UrPcPtb1r0KsQs#QTmU%jFVJ-+YDw^C?Sn3tocm zKEP6d;{OhV`OaFj@}w@U*jdy)TRw*xxqccfBhE)mO6XDNq!}pgR9|d<53_S*tut!U zH8*CC$uu7U|900oAT500o`321#k_URpL+VrjK!&F> zJ^9D(g*b<_gnRO@SW4VXbCI6 zhxK{#QH88M_r36_L0SD+dX((`(IgtRtj5SN)mimD20-{s`}{?wc7w3OcbSq!Px}Gn z8qlm$><+IjBB|g>1;>`CRFD4aJE&k@<5|LpD84IeuNk8Zy`=?#8QeFPDo-C}HLCKU zIsU?^U`oo%%Pf!jGu-);U`M$e=df*jGI1!+cY-9#h7H=7o*MYyl!%!*!78mu!w#wm zk69s1(@gV(*fqu;i1{a;B^kg#<89C5RU)v9>J0q6!RJKj;`c<4BmYU`C4z`AQ`V)L z{!^M4`^?tAGmGF#|5wi(?6Mv&YMYX-3c$XBv%!yDKL^t2cjAjxX=WwUnm`xxZ3TE+ zng@Iss6Ovf%Mu?r4_@b+uLtzTAU77Y*2pq>HaFt@_mZ1+O7f6@hlZy~t>JSzQlTxp zO8ky%)cQzXYjmhp*08o&Qr2Y@tGHv$e1oQJ3pN+h8F8(jU#~uTsNG(GQ>$)O6{^-3 zt>?M_iu3fa`E?2mXv*1IXKcN`T3oTV>tG%yEis0kSA#O&F+U9A%)B&-xzXdmD>a?$ z@k6^dx;ADE04Zf?A1rci4IRpy;fXpUqBYVz$LvNbH%K7GSH(1;-@lh*=S`Fg%Jm>@ z06hqb5O;A>n9e2p$>ecis@vmEcG#2e%eJY?ZUqDs*-nn(Xg-|=_pRd4JUB;M0Jcgr zRqB^=L`cE+ywG`2wRaP1`<2_rBaeD`Tmb zJ4zTb6H5--iHW09cK5#eTqXAt$pL0CSFrFvw1@I_Q3v<`dVwBK(uAy|W|&`ZPu9Pz zwrhR(f%qP-<$0VX!u+TvZhPlG1uko`f4y%Cf0dN()8^SIFxeEF<*A1Rc-Q(--FIzf zPdgd>I!&5Bc!R8Q-c2x2?TOG_$%hXIauD15zDd~p5dHQiVHUeQxAUU)jnJ`5*VL|! ztNgV(dN*;XCS8|%6A^koW_vSR*T_x`{#erb8^D~0nR^Yx$1k!?sg z-=E40YZQ`QQ_^eLjPGM_J*k2QEXZ#d%GqXUw|hQGJo#XW9JZFVaI6MgBzR#N)VFD- z4xV@`O`qAarik@dWg1Nw@k`aR;FLVa&wrRA2S`rJ7XlVde^7@79R(daxS%giZ^&hj zMh3eDHhJ3O{fe1~r`~<#ued%_Hr{a$D4D_1QI`JZfmnW@1YBj-XDzd11Kp!5r!uCs zTL}O7pg7m^v^qzuK)LEqOb)cvQ@lT>=C8ED=Gd4ZtK=^zQYZC5ZB5QevmnazHm$-y zGk`mgyteQ}%AR zPb2Rb2H!pzfoid=7NNv1&T&&~X`~L?okFYyH!0-*QbmUzH2B zJ=(QR2V<$>jux)7+r`+xi-i}cBj~w?Ca`zUdq|P6h(_?mfHG^c{ zNU8glI6Oza;5XMLQm?%4FRW1yU(&{Ic0JJW8ELPFj2j_SVE>{m=-G{n^xEi6*t}n8 zvN56uJ}#R)b({8dP-`pD-?KqraprLRLR)hY^iOzNv=soR0MSmHy5O*J&Z6|?%6yE7 zfX`m1_Z;#S%G+xZ;QZy_ie{v!fg)gzJ$#ar6;y9aj_HlSowq#B9X3B+Bpf@Zw*#D7 z`7_D_03bXeZ3m6Q1v^Yg|AY*z<%PK8q%2VY0Qls%DPrqT(mj#4R;H;RZ+~BQm_0=O zvq(K-w*@Kp%0&v|mF(CLU<&HB!S5ZOJHD_D zJdqCmDi5Fp4;OS$xkmEhpcd|~2p+AOJ#d(gXJvnss4z-o^OhffzvsrZ5T~6ocLTuW zM0U0(;qq1@g<4*Aq_}NaYuRl;mD#E@NsC@gCH6@xyV@L~GM;QJ%5uI(L16Hw=ZOZW zH-NCw$C|%=+h_Dpl^nxN_l)t8P0w&EYUelj92489GXR9}bUXRmGE3wRO3;1UTE8q$ zV_@G3u=LhZ4?W^{ZyQT%t?pePm9b0OF6Fw(UvGPga*enwhcsuouPf*B!>+Lh^UssG z-$`tJs$PN?*|{}eN8@`EcWCOgp5Mn0M&~tr>f3A6EVVc#b&0@RZ{U(2R9X2;k>#3@iY^p}^XW09^=mz+qNcy!?3IP?B{Go&ayk?eWY9tvt){ zMS89}9M?gQGbOn_S+z$)VQ#1VQL@6UaicB{G~}qO#T{q1$t2wjF!qTv%AE%a0!!oJ zlkcN#)4o9xnCvZ#yT-N0sXL()SBy-nUh13atgckl697IJ^t|NH;w|$YlstSaZy3qo z@F{+u=Yh}XQ-UbUdLw}!DJQyo=vy(KlF@C_tR_P+A1H0gULbIc38S7>2@6bI!iU&&2e8Xs#z5(R+ z>eN68&7R7Q|AAn@{{mUI!OU|bz^qyqLwTE<{{9vBJt4p!W|#2t_&&pBSc%ax6J1ZQn0Txw9BZ;nSWw zM3uS5=7(0xj*is=PH);MH|w)}y;xuQmh&&HvsKVqjK}jll@EBu(&c8Fb2y}*;OR#z z0fS$An=GHtvwnJrKgrioDpQ6fJab~E&reW59_V1Q7+AkS01V~&s*HLAB)wp`g-6IT zZ%Le$Omoe?VQV_A&!N7o#wc#e&#C$2ExYM+aKj*9^UWpo;uhMqS-!umYj-F>Yb$fH z`Ww<+$ge+5TQ%GIflqT1SuBH+-eXZ*&iegW`n!AEHkCH=!~ksucx;Eh|D&xvh?s)o z2-U7jAx2h4?YDH%jMg}^1$0$;3TQS=)R+eV^6!iE0hAe%!8!m)TNl^$ugKPRphF5j z7NyJYX%?ZE$WnAUD^v_q5>o(xeun>*jExplL&lFQ0 zR>pBfbZCTD9UgHKkp8dl+i3K%3pFna{6>y%Z4xjOWjY~)5>i)D=FDf^- zHv}3t0U(HytX5afj8fxDfH?=DB*+e}%#>qkO`KU+f>t*HTFGdy;z%9Gw3`$(;zJzY zmcl%4ENG(Dxtf>yJ@UUL8Zs&o(j4Hz(0K-Q-DUwR-=!8r4iEs9cRxn!$!vSZF6au$ z5_OP#1hDn^T3T1NXE<;@sPhbAm3^f}KDz z5pP!$41rn#E$~)5?gatlIm-rX6Il?d*K#ow1yoIy^P2eyG7u=4wF!gmB1)2hiYb7Z zvDCL~NO5EG>(W`TG301BV)+~lJ&=b+U{j6HChSxXdFH3qJWY@56d>G8OzEjL<^139 zq)!82zGc)~*K9Q=-<7V`HHNQ9C9t%D>1efiaSyE=bUeRDzO9`@rT6%(uQ)Zz@sGhu zAklkY8`eHYl82MNN?`x0ik&H9X|8135P~`y`d2smy<;U!yq!!`9b5M~&yzh(bi>!Q z`sj3^R`f`@X_cZ8UeX}_ zUFNZRj!z8HKb`gd&BdV`SOIP;8Ulw&(Xf6z!M~Khuke z*}|i8;+dB{G4PP(F!1B*yy2txTdm)zzBxib9+H8Bpu;X^v3b7yIb;w?8LBcgWgB=v zZxMWw<@e_EX&t5ZmL?Mhh-GD8dFnf_ZCitYzfm5iP~3>RS9vku&Tm-F=Uf2M$KqbS zZ}YFFY+CQ=IuC%y^_uH(c3#w1m8tO6yWb+uy|rv1zrX_g={01L#U z=qkTKyfZ&NfYm7q0DvE3Gq^ALT{CTupZmc4f0UiS{<=P&y1o#G?Y11_89>OKOZ}=B zsFtQUXX@GPeXC=oX0<$72Tl#tMPAgC|ouNb;$SCt!KgH(4%f`#!SWD{Haik?=VET&QI_ z2D2Y`J`ecTq_gNmy>&e-?Gw|K9A|S*oGu`%)Gs)@Fd{ioj$|zA?lJlg2 zf%Kc-1JLS!33#@BYwHZ}+?oxdewDfaXgXyiQ4sZ)W=n%d_Jc}q1%hvq+rGQZ#||L?Kp1c9woVX5NOk^u^ckn&hvm!RPdsZyjC1|1bL!R(&Z1;3#3$YAQ4% zXBtO0daReMI!e@Ar8e+F7nFMea%b=zFtfg6HnX-*)i2v4UYfPL-){4_u>nn9e~o5& z%a+(+F!}sY>p=ZpI?*rw+`4VSh<3M-_2sQ!$MI0<8+|PLTSr?7RyrO(*KhwVXV4$W z`Z_sjdUZD01LQP?dRd)uggm4U5-Ni&oVdMhfzQyqk%#akb0)$3z_$Yn&>CX9)DP%% zS%B-#HP~@O&)tC3r7nP0Wf|$HM5_7^h{R%yeAO#7R`Zu`6>0T{OyHw z`J*mE09rt$zy10~3xH)r)3Y;)7(JbCpF4}B^nwqhLlP4zPud#_RarAKg-L@s0JS|5 zr3Zl1-$xsf>7-f)?gs(Y_0ku#X*2q$jQZZ3kfF*}gi{os@< zElEcUHuM5L{2K3LEy1ate=;HUQRhRq9g4YhcZ`$lhX8=#wZsAdfbdEEOvicd)NAyW zx#K|1Q8~9=ubR+Mm1-GiO(6=oEKcp)T7l&^}6Ja znUE5r(h~vcM&Xw$&bO+sm}y08Ol5U-u&B4J1pL%(1Bjmn0c-=RoG93%+FLL9S6ZOx zCrEdpyA%SKJrb_8l6Mk%Ph-5@@(dNiW%_Mu`AssJ=Q)aXq4jkl`EAH4``~|^ba@G? z>@zhAK}_0Hwz1{UjPRF84kKfO2LOGJS@)~$fOcny)%CPTZ}_Mx)~(e2%fVksE`M6N zoMUFMQM+!} zMU>sVuNsz|haP2Djf!so2ZlUeKEq*t7q zgL-15&jJwO@d7~MaynYdz+#Aw(##mxZMPiXPFe8g3R$Sz-q4Cm&qmTR>pc!)06W3v z%>fOZX^7_GL)%$H` zoqor!4Vy`BvvpNTs@8qYaY6H%at8I?By*kn0$GW?Ek4t3ci*yYPkO7@SCcqZ`@;2P zFJ$4P<|AsIF1Zl~k7>iM0qlFSyk>zwIS1*St3DU$3u`=^zRHr544C{x2Fh>Hb@>jD zyI?i1-xml}wkcA%*$1gCUMyV_cc=)tq5vVjeYqG2*4LX_2i9lXW0IVkz_vwl>;l9$ z6GGD`W5dx^ce;(B1irICo|o~Uo5aJ%_2fKWS+`D*caHAJiRm_={5D^6N4H!=IVZ|e zIZR?4F$eYd_MBRe<8nWE1ZjOj0BpYjeQKWbzK}E1TSt-gp79|ibJ96vjvzo<>TX~W zOy)$@uhGsrJFCNZ@{)HRxOFt6N0zNVLz@U%j=T?W=z-!{rnzo0OC6K63);G+{j2+o zUOu!wwh|z@O+jzO1~PaNssNY86EA-S{HxbN`j_cnBzxZ&v&q4+z=X6) z;&Vh+kj0Rn<36LDI2(rFO!6bAzoBft>aP}yGHi;Tbc#DvYzt)!lVTqB;WbwSoMx<}*bByDRq;`=bj zK)4N(J3y%ZrUS+Q(X~-?fMxfo!7-U5k_;HlOM%B}zkIZQc0Vq$gcGRj`^8J!$ zW^O@7-q;_LZ}v2by}Ud@b2kmv#aVE)6e`I!c!w+^cb;nlY)1QS&t+s&CA4*GPO?_N z%SamXdKV;6Yvlc&j2*zzW^eC~+cq}sRQ}lCH_UE6p0zU`&lj*YFOG?~x%Fo>&oy8r zKpdkHMtXF8qxz4P*sH~;iRNg~`9bmbBxMKEai0o451c7W4yfLI-l%s3G>(CjwvGqN zd^^#nO~25ZsYN9Z2wDY*NM4*}pz@2=U_7zNJeE?g>A1lZyG>*>uI$h`1ZJ@9z_M$N zZ;tE)0(lt$WO;FA_%o0X#838}sJt$r`m@MVFs?hO@dq1TxN|LlJDtUD9hQ#j2lm*x z%Kt{FH(JrhdM6;G>4xO>iYg`G5Wk7*8IO_7^WOpMYPihL%J%s{RgslCLVGd-gAja>QQXMpjZz;A}=LD7ec6d9{XU#%wf|fKf0092f z2Ig#?r;TK>j$B{J7H9fmJ

&zL_4$wSH2L)nj}S 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 JPDHLkV1mtcoF4!H literal 0 HcmV?d00001 From 138fc38349168b61cbfa761dd17778da1a4be27a Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 29 Nov 2022 16:17:41 +0800 Subject: [PATCH 39/86] Enable nullable in the startup templates. Resolve #14856 --- .../Data/MyProjectNameDbMigrationService.cs | 4 +- ...e.MyProjectName.Blazor.Server.Mongo.csproj | 1 + .../MyProjectNameModule.cs | 2 +- .../Data/MyProjectNameDbMigrationService.cs | 10 +-- ...anyName.MyProjectName.Blazor.Server.csproj | 1 + .../MyProjectNameModule.cs | 2 +- .../Data/MyProjectNameDbMigrationService.cs | 4 +- .../Data/OpenIddictDataSeedContributor.cs | 14 ++-- ...ompanyName.MyProjectName.Host.Mongo.csproj | 1 + .../MyProjectNameModule.cs | 6 +- .../Data/MyProjectNameDbMigrationService.cs | 10 +-- .../Data/OpenIddictDataSeedContributor.cs | 14 ++-- .../MyCompanyName.MyProjectName.Host.csproj | 1 + .../MyProjectNameModule.cs | 6 +- .../Data/MyProjectNameDbMigrationService.cs | 4 +- ...CompanyName.MyProjectName.Mvc.Mongo.csproj | 1 + .../Data/MyProjectNameDbMigrationService.cs | 10 +-- .../MyCompanyName.MyProjectName.Mvc.csproj | 1 + ...MyProjectName.Application.Contracts.csproj | 1 + ...mpanyName.MyProjectName.Application.csproj | 1 + ...ompanyName.MyProjectName.AuthServer.csproj | 1 + .../MyProjectNameAuthServerModule.cs | 6 +- .../Pages/Index.cshtml | 69 +++++++++---------- .../Pages/Index.cshtml.cs | 6 +- ....MyProjectName.Blazor.Server.Tiered.csproj | 1 + ...anyName.MyProjectName.Blazor.Server.csproj | 1 + .../MyProjectNameBlazorModule.cs | 3 +- .../MyCompanyName.MyProjectName.Blazor.csproj | 1 + ...ompanyName.MyProjectName.DbMigrator.csproj | 1 + ...anyName.MyProjectName.Domain.Shared.csproj | 1 + .../Data/MyProjectNameDbMigrationService.cs | 15 ++-- .../MyCompanyName.MyProjectName.Domain.csproj | 1 + .../OpenIddictDataSeedContributor.cs | 24 +++---- ...e.MyProjectName.EntityFrameworkCore.csproj | 1 + ...nyName.MyProjectName.HttpApi.Client.csproj | 1 + ...panyName.MyProjectName.HttpApi.Host.csproj | 1 + .../MyProjectNameHttpApiHostModule.cs | 10 ++- ...e.MyProjectName.HttpApi.HostWithIds.csproj | 1 + .../MyProjectNameHttpApiHostModule.cs | 14 ++-- ...MyCompanyName.MyProjectName.HttpApi.csproj | 1 + ...MyCompanyName.MyProjectName.MongoDB.csproj | 1 + ...yCompanyName.MyProjectName.Web.Host.csproj | 1 + .../Menus/MyProjectNameMenuContributor.cs | 4 +- .../MyCompanyName.MyProjectName.Web.csproj | 1 + ...ame.MyProjectName.Application.Tests.csproj | 1 + ...panyName.MyProjectName.Domain.Tests.csproj | 1 + ...rojectNameEntityFrameworkCoreTestModule.cs | 4 +- ...ojectName.EntityFrameworkCore.Tests.csproj | 1 + ...tName.HttpApi.Client.ConsoleTestApp.csproj | 1 + ...anyName.MyProjectName.MongoDB.Tests.csproj | 1 + ...yCompanyName.MyProjectName.TestBase.csproj | 1 + .../Security/FakeCurrentPrincipalAccessor.cs | 27 ++------ ...CompanyName.MyProjectName.Web.Tests.csproj | 1 + .../MyProjectNameWebTestBase.cs | 7 +- .../WebContentDirectoryFinder.cs | 2 +- .../MyCompanyName.MyProjectName.csproj | 1 + .../MyCompanyName.MyProjectName.csproj | 5 +- ...ompanyName.MyProjectName.AuthServer.csproj | 1 + .../MyProjectNameAuthServerModule.cs | 4 +- .../OpenIddictDataSeedContributor.cs | 20 +++--- ...mpanyName.MyProjectName.Blazor.Host.csproj | 1 + .../Pages/Index.razor | 6 +- ...me.MyProjectName.Blazor.Server.Host.csproj | 1 + .../MyProjectNameBlazorHostModule.cs | 4 +- .../Pages/Index.razor | 3 - ...mpanyName.MyProjectName.Host.Shared.csproj | 1 + ...panyName.MyProjectName.HttpApi.Host.csproj | 1 + .../MyProjectNameHttpApiHostModule.cs | 4 +- ...yCompanyName.MyProjectName.Web.Host.csproj | 1 + ...mpanyName.MyProjectName.Web.Unified.csproj | 1 + ...MyProjectName.Application.Contracts.csproj | 1 + ...mpanyName.MyProjectName.Application.csproj | 1 + ...anyName.MyProjectName.Blazor.Server.csproj | 1 + ...me.MyProjectName.Blazor.WebAssembly.csproj | 3 +- .../MyCompanyName.MyProjectName.Blazor.csproj | 1 + ...anyName.MyProjectName.Domain.Shared.csproj | 1 + .../MyCompanyName.MyProjectName.Domain.csproj | 1 + .../MyProjectNameDbProperties.cs | 2 +- ...e.MyProjectName.EntityFrameworkCore.csproj | 1 + ...nyName.MyProjectName.HttpApi.Client.csproj | 1 + ...MyCompanyName.MyProjectName.HttpApi.csproj | 1 + ...CompanyName.MyProjectName.Installer.csproj | 1 + ...MyCompanyName.MyProjectName.MongoDB.csproj | 1 + .../MyCompanyName.MyProjectName.Web.csproj | 1 + ...ame.MyProjectName.Application.Tests.csproj | 1 + ...panyName.MyProjectName.Domain.Tests.csproj | 1 + .../Samples/SampleManager_Tests.cs | 4 +- ...ojectName.EntityFrameworkCore.Tests.csproj | 1 + ...tName.HttpApi.Client.ConsoleTestApp.csproj | 1 + ...anyName.MyProjectName.MongoDB.Tests.csproj | 1 + ...yCompanyName.MyProjectName.TestBase.csproj | 1 + .../Samples/SampleRepository_Tests.cs | 4 +- .../Security/FakeCurrentPrincipalAccessor.cs | 27 ++------ .../MyCompanyName.MyProjectName/App.xaml.cs | 11 +-- .../MyCompanyName.MyProjectName.csproj | 1 + 95 files changed, 226 insertions(+), 205 deletions(-) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Data/MyProjectNameDbMigrationService.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Data/MyProjectNameDbMigrationService.cs index 1d598a1ce9..54a179ea61 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/Data/MyProjectNameDbMigrationService.cs @@ -70,13 +70,13 @@ public class MyProjectNameDbMigrationService : ITransientDependency Logger.LogInformation("You can safely end this process..."); } - private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) { Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); await _dbSchemaMigrator.MigrateAsync(); } - private async Task SeedDataAsync(Tenant tenant = null) + private async Task SeedDataAsync(Tenant? tenant = null) { Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj index 0983f7740c..7f4f101afa 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj @@ -2,6 +2,7 @@ net7.0 + enable enable true diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs index f234a8b833..e088b4a84f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs @@ -164,7 +164,7 @@ public class MyProjectNameModule : AbpModule Configure(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; - options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); }); } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Data/MyProjectNameDbMigrationService.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Data/MyProjectNameDbMigrationService.cs index eeffd14d64..352c55ef26 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Data/MyProjectNameDbMigrationService.cs @@ -79,13 +79,13 @@ public class MyProjectNameDbMigrationService : ITransientDependency Logger.LogInformation("You can safely end this process..."); } - private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) { Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); await _dbSchemaMigrator.MigrateAsync(); } - private async Task SeedDataAsync(Tenant tenant = null) + private async Task SeedDataAsync(Tenant? tenant = null) { Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); @@ -184,15 +184,15 @@ public class MyProjectNameDbMigrationService : ITransientDependency return Path.Combine(slnDirectoryPath, "MyCompanyName.MyProjectName.Blazor.Server"); } - private string GetSolutionDirectoryPath() + private string? GetSolutionDirectoryPath() { var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); - while (Directory.GetParent(currentDirectory.FullName) != null) + while (currentDirectory != null && Directory.GetParent(currentDirectory.FullName) != null) { currentDirectory = Directory.GetParent(currentDirectory.FullName); - if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) + if (currentDirectory != null && Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) { return currentDirectory.FullName; } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index 8573e93e48..6161a2f87d 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -2,6 +2,7 @@ net7.0 + enable enable true diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs index 6defe2cc2c..b0953ae2eb 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs @@ -166,7 +166,7 @@ public class MyProjectNameModule : AbpModule Configure(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; - options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); }); } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/MyProjectNameDbMigrationService.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/MyProjectNameDbMigrationService.cs index 1d598a1ce9..54a179ea61 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/MyProjectNameDbMigrationService.cs @@ -70,13 +70,13 @@ public class MyProjectNameDbMigrationService : ITransientDependency Logger.LogInformation("You can safely end this process..."); } - private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) { Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); await _dbSchemaMigrator.MigrateAsync(); } - private async Task SeedDataAsync(Tenant tenant = null) + private async Task SeedDataAsync(Tenant? tenant = null) { Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs index 429a83d562..8807969649 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs @@ -78,7 +78,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { var webClientRootUrl = configurationSection["MyProjectName_App:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: consoleAndAngularClientId, + name: consoleAndAngularClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Console Test / Angular Application", @@ -100,10 +100,10 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep var swaggerClientId = configurationSection["MyProjectName_Swagger:ClientId"]; if (!swaggerClientId.IsNullOrWhiteSpace()) { - var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"].TrimEnd('/'); + var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: swaggerClientId, + name: swaggerClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Swagger Application", @@ -123,12 +123,12 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep [NotNull] string type, [NotNull] string consentType, string displayName, - string secret, + string? secret, List grantTypes, List scopes, - string redirectUri = null, - string postLogoutRedirectUri = null, - List permissions = null) + string? redirectUri = null, + string? postLogoutRedirectUri = null, + List? permissions = null) { if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj index 60712105a2..62eda99090 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyCompanyName.MyProjectName.Host.Mongo.csproj @@ -2,6 +2,7 @@ net7.0 + enable enable true diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs index 45e5006b8a..aa072a238e 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs @@ -171,7 +171,7 @@ public class MyProjectNameModule : AbpModule Configure(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; - options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); options.Applications["Angular"].RootUrl = configuration["App:ClientUrl"]; options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password"; @@ -275,10 +275,10 @@ public class MyProjectNameModule : AbpModule { builder .WithOrigins( - configuration["App:CorsOrigins"] + configuration["App:CorsOrigins"]? .Split(",", StringSplitOptions.RemoveEmptyEntries) .Select(o => o.RemovePostFix("/")) - .ToArray() + .ToArray() ?? Array.Empty() ) .WithAbpExposedHeaders() .SetIsOriginAllowedToAllowWildcardSubdomains() diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/MyProjectNameDbMigrationService.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/MyProjectNameDbMigrationService.cs index b0b929dcc9..83d4f3dcbb 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/MyProjectNameDbMigrationService.cs @@ -79,13 +79,13 @@ public class MyProjectNameDbMigrationService : ITransientDependency Logger.LogInformation("You can safely end this process..."); } - private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) { Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); await _dbSchemaMigrator.MigrateAsync(); } - private async Task SeedDataAsync(Tenant tenant = null) + private async Task SeedDataAsync(Tenant? tenant = null) { Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); @@ -184,15 +184,15 @@ public class MyProjectNameDbMigrationService : ITransientDependency return Path.Combine(slnDirectoryPath, "MyCompanyName.MyProjectName.Host"); } - private string GetSolutionDirectoryPath() + private string? GetSolutionDirectoryPath() { var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); - while (Directory.GetParent(currentDirectory.FullName) != null) + while (currentDirectory != null && Directory.GetParent(currentDirectory.FullName) != null) { currentDirectory = Directory.GetParent(currentDirectory.FullName); - if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) + if (currentDirectory != null && Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) { return currentDirectory.FullName; } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs index 429a83d562..8807969649 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs @@ -78,7 +78,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { var webClientRootUrl = configurationSection["MyProjectName_App:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: consoleAndAngularClientId, + name: consoleAndAngularClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Console Test / Angular Application", @@ -100,10 +100,10 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep var swaggerClientId = configurationSection["MyProjectName_Swagger:ClientId"]; if (!swaggerClientId.IsNullOrWhiteSpace()) { - var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"].TrimEnd('/'); + var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: swaggerClientId, + name: swaggerClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Swagger Application", @@ -123,12 +123,12 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep [NotNull] string type, [NotNull] string consentType, string displayName, - string secret, + string? secret, List grantTypes, List scopes, - string redirectUri = null, - string postLogoutRedirectUri = null, - List permissions = null) + string? redirectUri = null, + string? postLogoutRedirectUri = null, + List? permissions = null) { if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) { diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj index afb804eae6..68cdc93feb 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyCompanyName.MyProjectName.Host.csproj @@ -2,6 +2,7 @@ net7.0 + enable enable true diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs index 16ef3cf47b..bbc6b36262 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs @@ -174,7 +174,7 @@ public class MyProjectNameModule : AbpModule Configure(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; - options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); options.Applications["Angular"].RootUrl = configuration["App:ClientUrl"]; options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password"; @@ -278,10 +278,10 @@ public class MyProjectNameModule : AbpModule { builder .WithOrigins( - configuration["App:CorsOrigins"] + configuration["App:CorsOrigins"]? .Split(",", StringSplitOptions.RemoveEmptyEntries) .Select(o => o.RemovePostFix("/")) - .ToArray() + .ToArray() ?? Array.Empty() ) .WithAbpExposedHeaders() .SetIsOriginAllowedToAllowWildcardSubdomains() diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Data/MyProjectNameDbMigrationService.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Data/MyProjectNameDbMigrationService.cs index 1d598a1ce9..54a179ea61 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/Data/MyProjectNameDbMigrationService.cs @@ -70,13 +70,13 @@ public class MyProjectNameDbMigrationService : ITransientDependency Logger.LogInformation("You can safely end this process..."); } - private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) { Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); await _dbSchemaMigrator.MigrateAsync(); } - private async Task SeedDataAsync(Tenant tenant = null) + private async Task SeedDataAsync(Tenant? tenant = null) { Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj index 5f99ac74ae..a203e9e1cf 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/MyCompanyName.MyProjectName.Mvc.Mongo.csproj @@ -2,6 +2,7 @@ net7.0 + enable enable true diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Data/MyProjectNameDbMigrationService.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Data/MyProjectNameDbMigrationService.cs index 14db7d1e8d..d51d346284 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Data/MyProjectNameDbMigrationService.cs @@ -79,13 +79,13 @@ public class MyProjectNameDbMigrationService : ITransientDependency Logger.LogInformation("You can safely end this process..."); } - private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) { Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); await _dbSchemaMigrator.MigrateAsync(); } - private async Task SeedDataAsync(Tenant tenant = null) + private async Task SeedDataAsync(Tenant? tenant = null) { Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); @@ -184,15 +184,15 @@ public class MyProjectNameDbMigrationService : ITransientDependency return Path.Combine(slnDirectoryPath, "MyCompanyName.MyProjectName.Mvc"); } - private string GetSolutionDirectoryPath() + private string? GetSolutionDirectoryPath() { var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); - while (Directory.GetParent(currentDirectory.FullName) != null) + while (currentDirectory != null && Directory.GetParent(currentDirectory.FullName) != null) { currentDirectory = Directory.GetParent(currentDirectory.FullName); - if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) + if (currentDirectory != null && Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) { return currentDirectory.FullName; } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj index c848ad3cf6..21cdc1b0db 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.Mvc.csproj @@ -2,6 +2,7 @@ net7.0 + enable enable true diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName.MyProjectName.Application.Contracts.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName.MyProjectName.Application.Contracts.csproj index 1e50cf8678..6029c23a7f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName.MyProjectName.Application.Contracts.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName.MyProjectName.Application.Contracts.csproj @@ -4,6 +4,7 @@ netstandard2.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj index 8037a452b4..a9c83b797b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index 21fb37e73e..70a55520a0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs index fb963a81c7..c8f1c89424 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs @@ -114,7 +114,7 @@ public class MyProjectNameAuthServerModule : AbpModule Configure(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; - options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); options.Applications["Angular"].RootUrl = configuration["App:ClientUrl"]; options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password"; @@ -150,10 +150,10 @@ public class MyProjectNameAuthServerModule : AbpModule { builder .WithOrigins( - configuration["App:CorsOrigins"] + configuration["App:CorsOrigins"]? .Split(",", StringSplitOptions.RemoveEmptyEntries) .Select(o => o.RemovePostFix("/")) - .ToArray() + .ToArray() ?? Array.Empty() ) .WithAbpExposedHeaders() .SetIsOriginAllowedToAllowWildcardSubdomains() diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml index 48b2d8de02..e45ec1b8f1 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml @@ -19,10 +19,8 @@

- -
\ No newline at end of file +
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml.cs index b700bdd9bb..d734388689 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml.cs @@ -9,11 +9,11 @@ namespace MyCompanyName.MyProjectName.Pages; public class IndexModel : AbpPageModel { - public List Applications { get; protected set; } + public List? Applications { get; protected set; } - public IReadOnlyList Languages { get; protected set; } + public IReadOnlyList? Languages { get; protected set; } - public string CurrentLanguage { get; protected set; } + public string? CurrentLanguage { get; protected set; } protected IOpenIddictApplicationRepository OpenIdApplicationRepository { get; } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj index 832bd8d7ba..b67ef63875 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj @@ -4,6 +4,7 @@ net7.0 + enable true true true diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index eb34741aa4..01766b2110 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -4,6 +4,7 @@ net7.0 + enable true true true diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs index b4f2e723e3..758b60f74e 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; @@ -111,7 +112,7 @@ public class MyProjectNameBlazorModule : AbpModule Configure(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; - options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); }); } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 53338ee686..481062bd15 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -4,6 +4,7 @@ net7.0 + enable true service-worker-assets.js diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj index af519e222a..3c581e3947 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj @@ -5,6 +5,7 @@ Exe net7.0 + enable diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index cb7b4cd5bf..d90c6e0a7c 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -4,6 +4,7 @@ netstandard2.0 + enable MyCompanyName.MyProjectName true diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs index dd0e61135d..16ef00af77 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Data/MyProjectNameDbMigrationService.cs @@ -87,7 +87,7 @@ public class MyProjectNameDbMigrationService : ITransientDependency Logger.LogInformation("You can safely end this process..."); } - private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) { Logger.LogInformation( $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); @@ -98,7 +98,7 @@ public class MyProjectNameDbMigrationService : ITransientDependency } } - private async Task SeedDataAsync(Tenant tenant = null) + private async Task SeedDataAsync(Tenant? tenant = null) { Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); @@ -152,8 +152,7 @@ public class MyProjectNameDbMigrationService : ITransientDependency private bool MigrationsFolderExists() { var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); - - return Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); + return dbMigrationsProjectFolder != null && Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); } private void AddInitialMigration() @@ -188,7 +187,7 @@ public class MyProjectNameDbMigrationService : ITransientDependency } } - private string GetEntityFrameworkCoreProjectFolderPath() + private string? GetEntityFrameworkCoreProjectFolderPath() { var slnDirectoryPath = GetSolutionDirectoryPath(); @@ -203,15 +202,15 @@ public class MyProjectNameDbMigrationService : ITransientDependency .FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore")); } - private string GetSolutionDirectoryPath() + private string? GetSolutionDirectoryPath() { var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); - while (Directory.GetParent(currentDirectory.FullName) != null) + while (currentDirectory != null && Directory.GetParent(currentDirectory.FullName) != null) { currentDirectory = Directory.GetParent(currentDirectory.FullName); - if (Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) + if (currentDirectory != null && Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) { return currentDirectory.FullName; } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj index 16f823b3ba..61f9ea3e8d 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs index 804e15d0f2..7a8b8f7bf0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs @@ -87,7 +87,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep /* MyProjectName_Web client is only needed if you created a tiered * solution. Otherwise, you can delete this client. */ await CreateApplicationAsync( - name: webClientId, + name: webClientId!, type: OpenIddictConstants.ClientTypes.Confidential, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Web Application", @@ -110,7 +110,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { var consoleAndAngularClientRootUrl = configurationSection["MyProjectName_App:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: consoleAndAngularClientId, + name: consoleAndAngularClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Console Test / Angular Application", @@ -133,10 +133,10 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep var blazorClientId = configurationSection["MyProjectName_Blazor:ClientId"]; if (!blazorClientId.IsNullOrWhiteSpace()) { - var blazorRootUrl = configurationSection["MyProjectName_Blazor:RootUrl"].TrimEnd('/'); + var blazorRootUrl = configurationSection["MyProjectName_Blazor:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: blazorClientId, + name: blazorClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Blazor Application", @@ -159,7 +159,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep var blazorServerTieredRootUrl = configurationSection["MyProjectName_BlazorServerTiered:RootUrl"].EnsureEndsWith('/'); await CreateApplicationAsync( - name: blazorServerTieredClientId, + name: blazorServerTieredClientId!, type: OpenIddictConstants.ClientTypes.Confidential, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Blazor Server Application", @@ -180,10 +180,10 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep var swaggerClientId = configurationSection["MyProjectName_Swagger:ClientId"]; if (!swaggerClientId.IsNullOrWhiteSpace()) { - var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"].TrimEnd('/'); + var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: swaggerClientId, + name: swaggerClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Swagger Application", @@ -204,13 +204,13 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep [NotNull] string type, [NotNull] string consentType, string displayName, - string secret, + string? secret, List grantTypes, List scopes, - string clientUri = null, - string redirectUri = null, - string postLogoutRedirectUri = null, - List permissions = null) + string? clientUri = null, + string? redirectUri = null, + string? postLogoutRedirectUri = null, + List? permissions = null) { if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj index e8d5b7f7f3..36e3318b68 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyCompanyName.MyProjectName.HttpApi.Client.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyCompanyName.MyProjectName.HttpApi.Client.csproj index b2bd230422..702510363b 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyCompanyName.MyProjectName.HttpApi.Client.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyCompanyName.MyProjectName.HttpApi.Client.csproj @@ -4,6 +4,7 @@ netstandard2.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 540657184c..d2e831a9e0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-4681b4fd-151f-4221-84a4-929d86723e4c diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index 0c8ef2c82c..c848b1f774 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -155,12 +155,10 @@ public class MyProjectNameHttpApiHostModule : AbpModule options.AddDefaultPolicy(builder => { builder - .WithOrigins( - configuration["App:CorsOrigins"] - .Split(",", StringSplitOptions.RemoveEmptyEntries) - .Select(o => o.RemovePostFix("/")) - .ToArray() - ) + .WithOrigins(configuration["App:CorsOrigins"]? + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() ?? Array.Empty()) .WithAbpExposedHeaders() .SetIsOriginAllowedToAllowWildcardSubdomains() .AllowAnyHeader() diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj index 6e72b6879f..abc297b855 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-4681b4fd-151f-4221-84a4-929d86723e4c diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs index a88511db4e..dd79fb773c 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs @@ -95,7 +95,7 @@ public class MyProjectNameHttpApiHostModule : AbpModule Configure(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; - options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); options.Applications["Angular"].RootUrl = configuration["App:ClientUrl"]; options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password"; @@ -155,14 +155,12 @@ public class MyProjectNameHttpApiHostModule : AbpModule context.Services.AddCors(options => { options.AddDefaultPolicy(builder => - { + { builder - .WithOrigins( - configuration["App:CorsOrigins"] - .Split(",", StringSplitOptions.RemoveEmptyEntries) - .Select(o => o.RemovePostFix("/")) - .ToArray() - ) + .WithOrigins(configuration["App:CorsOrigins"]? + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() ?? Array.Empty()) .WithAbpExposedHeaders() .SetIsOriginAllowedToAllowWildcardSubdomains() .AllowAnyHeader() diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj index 2a585f45a4..08243ccd22 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj index e9f07986e2..e39e4d8082 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index fe7c773451..4840959fcd 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName.Web $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs index 7a85f3ab7e..84f6b391b7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs @@ -18,7 +18,7 @@ public class MyProjectNameMenuContributor : IMenuContributor } } - private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) + private Task ConfigureMainMenuAsync(MenuConfigurationContext context) { var administration = context.Menu.GetAdministration(); var l = context.GetLocalizer(); @@ -45,5 +45,7 @@ public class MyProjectNameMenuContributor : IMenuContributor administration.SetSubItemOrder(IdentityMenuNames.GroupName, 2); administration.SetSubItemOrder(SettingManagementMenuNames.GroupName, 3); + + return Task.CompletedTask; } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index 560ba570dd..90f7f56e0a 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName.Web $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj index ee00e7f04c..12f36a7520 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj index defd452da5..27d5002e1b 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs index d68373b4fb..0a76f9928e 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs @@ -17,7 +17,7 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore; )] public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule { - private SqliteConnection _sqliteConnection; + private SqliteConnection? _sqliteConnection; public override void ConfigureServices(ServiceConfigurationContext context) { @@ -39,7 +39,7 @@ public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule public override void OnApplicationShutdown(ApplicationShutdownContext context) { - _sqliteConnection.Dispose(); + _sqliteConnection?.Dispose(); } private static SqliteConnection CreateDatabaseAndGetConnection() diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj index 6806868b1c..7b13ac6079 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj index 14dd55a22e..d8eff36d42 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj @@ -3,6 +3,7 @@ Exe net7.0 + enable diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj index b9844d6d0f..642c72b84f 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj index 05c7539b52..2a8705b312 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs index 717ba2c324..512430a84a 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs @@ -13,30 +13,13 @@ public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor return GetPrincipal(); } - private ClaimsPrincipal _principal; - private ClaimsPrincipal GetPrincipal() { - if (_principal == null) + return new ClaimsPrincipal(new ClaimsIdentity(new List { - lock (this) - { - if (_principal == null) - { - _principal = new ClaimsPrincipal( - new ClaimsIdentity( - new List - { - new Claim(AbpClaimTypes.UserId,"2e701e62-0953-4dd3-910b-dc6cc93ccb0d"), - new Claim(AbpClaimTypes.UserName,"admin"), - new Claim(AbpClaimTypes.Email,"admin@abp.io") - } - ) - ); - } - } - } - - return _principal; + new Claim(AbpClaimTypes.UserId, "2e701e62-0953-4dd3-910b-dc6cc93ccb0d"), + new Claim(AbpClaimTypes.UserName, "admin"), + new Claim(AbpClaimTypes.Email, "admin@abp.io") + })); } } diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj index 05193d0987..9bf9d3e1d7 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyCompanyName.MyProjectName.Web.Tests.csproj @@ -4,6 +4,7 @@ net7.0 + enable Exe $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; MyCompanyName.MyProjectName diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyProjectNameWebTestBase.cs b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyProjectNameWebTestBase.cs index ae94b2fe6d..9736848b6b 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyProjectNameWebTestBase.cs +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/MyProjectNameWebTestBase.cs @@ -1,4 +1,5 @@ -using System.Net; +using System; +using System.Net; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; @@ -14,10 +15,10 @@ public abstract class MyProjectNameWebTestBase : AbpAspNetCoreIntegratedTestBase { return base .CreateHostBuilder() - .UseContentRoot(WebContentDirectoryFinder.CalculateContentRootFolder()); + .UseContentRoot(WebContentDirectoryFinder.CalculateContentRootFolder() ?? throw new InvalidOperationException()); } - protected virtual async Task GetResponseAsObjectAsync(string url, HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + protected virtual async Task GetResponseAsObjectAsync(string url, HttpStatusCode expectedStatusCode = HttpStatusCode.OK) { var strResponse = await GetResponseAsStringAsync(url, expectedStatusCode); return JsonSerializer.Deserialize(strResponse, new JsonSerializerOptions(JsonSerializerDefaults.Web)); diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/WebContentDirectoryFinder.cs b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/WebContentDirectoryFinder.cs index 4c8c4bfd0c..f0a3149272 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/WebContentDirectoryFinder.cs +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests/WebContentDirectoryFinder.cs @@ -11,7 +11,7 @@ namespace MyCompanyName.MyProjectName; /// public static class WebContentDirectoryFinder { - public static string CalculateContentRootFolder() + public static string? CalculateContentRootFolder() { var domainAssemblyDirectoryPath = Path.GetDirectoryName(typeof(MyProjectNameDomainModule).Assembly.Location); diff --git a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index c25eb1af14..616d70bc3e 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -5,6 +5,7 @@ Exe net7.0 + enable diff --git a/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index 205a22c2c9..b36be3895a 100644 --- a/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/maui/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -1,12 +1,13 @@  - + net7.0-android;net7.0-ios;net7.0-maccatalyst $(TargetFrameworks);net7.0-windows10.0.19041.0 + enable Exe MyCompanyName.MyProjectName true @@ -54,7 +55,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj index 13d7c366b4..022889cd58 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-c2d31439-b723-48e2-b061-5ebd7aeb6010 diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs index 8d5967e361..5fef3d79a8 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs @@ -175,10 +175,10 @@ public class MyProjectNameAuthServerModule : AbpModule { builder .WithOrigins( - configuration["App:CorsOrigins"] + configuration["App:CorsOrigins"]? .Split(",", StringSplitOptions.RemoveEmptyEntries) .Select(o => o.RemovePostFix("/")) - .ToArray() + .ToArray() ?? Array.Empty() ) .WithAbpExposedHeaders() .SetIsOriginAllowedToAllowWildcardSubdomains() diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/OpenIddict/OpenIddictDataSeedContributor.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/OpenIddict/OpenIddictDataSeedContributor.cs index 7ecafc5f6a..dea53ea554 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/OpenIddict/OpenIddictDataSeedContributor.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/OpenIddict/OpenIddictDataSeedContributor.cs @@ -86,7 +86,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep /* MyProjectName_Web client is only needed if you created a tiered * solution. Otherwise, you can delete this client. */ await CreateApplicationAsync( - name: webClientId, + name: webClientId!, type: OpenIddictConstants.ClientTypes.Confidential, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Web Application", @@ -108,7 +108,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { var consoleAndAngularClientRootUrl = configurationSection["MyProjectName_App:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: consoleAndAngularClientId, + name: consoleAndAngularClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Console Test / Angular Application", @@ -130,10 +130,10 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep var blazorClientId = configurationSection["MyProjectName_Blazor:ClientId"]; if (!blazorClientId.IsNullOrWhiteSpace()) { - var blazorRootUrl = configurationSection["MyProjectName_Blazor:RootUrl"].TrimEnd('/'); + var blazorRootUrl = configurationSection["MyProjectName_Blazor:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: blazorClientId, + name: blazorClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Blazor Application", @@ -152,10 +152,10 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep var swaggerClientId = configurationSection["MyProjectName_Swagger:ClientId"]; if (!swaggerClientId.IsNullOrWhiteSpace()) { - var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"].TrimEnd('/'); + var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"]?.TrimEnd('/'); await CreateApplicationAsync( - name: swaggerClientId, + name: swaggerClientId!, type: OpenIddictConstants.ClientTypes.Public, consentType: OpenIddictConstants.ConsentTypes.Implicit, displayName: "Swagger Application", @@ -175,12 +175,12 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep [NotNull] string type, [NotNull] string consentType, string displayName, - string secret, + string? secret, List grantTypes, List scopes, - string redirectUri = null, - string postLogoutRedirectUri = null, - List permissions = null) + string? redirectUri = null, + string? postLogoutRedirectUri = null, + List? permissions = null) { if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) { diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj index 5177f6af11..89d0af9e3c 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj @@ -4,6 +4,7 @@ net7.0 + enable true diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Pages/Index.razor b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Pages/Index.razor index 1140cddeff..cddd608f45 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Pages/Index.razor +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Pages/Index.razor @@ -47,12 +47,12 @@ @code { - private IEnumerable _claims; + private IEnumerable? _claims; - protected async override Task OnInitializedAsync() + protected override async Task OnInitializedAsync() { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); - if (authState.User.Identity.IsAuthenticated) + if (authState.User.Identity != null && authState.User.Identity.IsAuthenticated) { _claims = authState.User.Claims; } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj index 4557540843..ce942ef18c 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj @@ -4,6 +4,7 @@ net7.0 + enable true true true diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs index 46bb89e1b8..1dc8d7d14d 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs @@ -209,7 +209,7 @@ public class MyProjectNameBlazorHostModule : AbpModule Configure(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; - options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); }); #if DEBUG @@ -217,7 +217,7 @@ public class MyProjectNameBlazorHostModule : AbpModule #endif } - public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) { var env = context.GetEnvironment(); var app = context.GetApplicationBuilder(); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Pages/Index.razor b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Pages/Index.razor index 0c9af64456..a7aebf6ded 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Pages/Index.razor +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Pages/Index.razor @@ -1,8 +1,5 @@ @page "/" -@using Volo.Abp.MultiTenancy @inherits MyProjectNameComponentBase -@inject ICurrentTenant CurrentTenant -@inject AuthenticationStateProvider AuthenticationStateProvider
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Host.Shared/MyCompanyName.MyProjectName.Host.Shared.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Host.Shared/MyCompanyName.MyProjectName.Host.Shared.csproj index 8cb063a10b..0cd160826b 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Host.Shared/MyCompanyName.MyProjectName.Host.Shared.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Host.Shared/MyCompanyName.MyProjectName.Host.Shared.csproj @@ -4,6 +4,7 @@ netstandard2.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 34f688c58c..ebe9f5c565 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-c2d31439-b723-48e2-b061-5ebd7aeb6010 diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index a736a9ca0f..bc1ec583b6 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -143,10 +143,10 @@ public class MyProjectNameHttpApiHostModule : AbpModule { builder .WithOrigins( - configuration["App:CorsOrigins"] + configuration["App:CorsOrigins"]? .Split(",", StringSplitOptions.RemoveEmptyEntries) .Select(o => o.RemovePostFix("/")) - .ToArray() + .ToArray() ?? Array.Empty() ) .WithAbpExposedHeaders() .SetIsOriginAllowedToAllowWildcardSubdomains() diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index f0eb77f53f..efb9ebd119 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-c2d31439-b723-48e2-b061-5ebd7aeb6010 diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj index 1a37ef59ea..2d0959a426 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName true MyCompanyName.MyProjectName-c2d31439-b723-48e2-b061-5ebd7aeb6010 diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName.MyProjectName.Application.Contracts.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName.MyProjectName.Application.Contracts.csproj index c572d2bee1..341d5640d8 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName.MyProjectName.Application.Contracts.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName.MyProjectName.Application.Contracts.csproj @@ -4,6 +4,7 @@ netstandard2.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj index 82e5ec1a94..ddf2e84283 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyCompanyName.MyProjectName.Application.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj index fb7721dabc..828dbeda41 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj @@ -4,6 +4,7 @@ net7.0 + enable diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyCompanyName.MyProjectName.Blazor.WebAssembly.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyCompanyName.MyProjectName.Blazor.WebAssembly.csproj index 7a47626fc9..e89a3d035c 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyCompanyName.MyProjectName.Blazor.WebAssembly.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyCompanyName.MyProjectName.Blazor.WebAssembly.csproj @@ -4,8 +4,9 @@ net7.0 + enable - + diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index c5bf783de3..7ac06b0881 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -4,6 +4,7 @@ net7.0 + enable diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index 70f7079e3f..619813ab46 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -4,6 +4,7 @@ netstandard2.0 + enable MyCompanyName.MyProjectName true diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj index 2902edbe3d..aa33eecfda 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyCompanyName.MyProjectName.Domain.csproj @@ -4,6 +4,7 @@ netstandard2.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDbProperties.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDbProperties.cs index 2ac3e3f9e3..1fa7ecaf35 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDbProperties.cs +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDbProperties.cs @@ -4,7 +4,7 @@ public static class MyProjectNameDbProperties { public static string DbTablePrefix { get; set; } = "MyProjectName"; - public static string DbSchema { get; set; } = null; + public static string? DbSchema { get; set; } = null; public const string ConnectionStringName = "MyProjectName"; } diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj index 5c50aed0f2..a1511f1a51 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/MyCompanyName.MyProjectName.EntityFrameworkCore.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyCompanyName.MyProjectName.HttpApi.Client.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyCompanyName.MyProjectName.HttpApi.Client.csproj index 8486d3f247..a05ea0e71a 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyCompanyName.MyProjectName.HttpApi.Client.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyCompanyName.MyProjectName.HttpApi.Client.csproj @@ -4,6 +4,7 @@ netstandard2.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj index 411049eb72..9edd4d08cc 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyCompanyName.MyProjectName.HttpApi.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyCompanyName.MyProjectName.Installer.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyCompanyName.MyProjectName.Installer.csproj index 5dcb0e44df..64f9efa66d 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyCompanyName.MyProjectName.Installer.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyCompanyName.MyProjectName.Installer.csproj @@ -4,6 +4,7 @@ net7.0 + enable true MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj index 654c7a14f3..95f1137ebb 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MyCompanyName.MyProjectName.MongoDB.csproj @@ -4,6 +4,7 @@ netstandard2.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index ea75e4e731..8985ad3713 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -4,6 +4,7 @@ net7.0 + enable $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; true Library diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj index ae01d6eff1..d472d6a29f 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyCompanyName.MyProjectName.Application.Tests.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj index 5edd4ddc4f..c13f03f701 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/Samples/SampleManager_Tests.cs b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/Samples/SampleManager_Tests.cs index 24254b2628..d9c35ff3f9 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/Samples/SampleManager_Tests.cs +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/Samples/SampleManager_Tests.cs @@ -13,8 +13,8 @@ public class SampleManager_Tests : MyProjectNameDomainTestBase } [Fact] - public async Task Method1Async() + public Task Method1Async() { - + return Task.CompletedTask; } } diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj index 69baaac85e..e4f7896f97 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj index 3c75dcf3c9..450625e048 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj @@ -3,6 +3,7 @@ Exe net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj index 1dffc4d80f..ef1b43437b 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.MongoDB.Tests/MyCompanyName.MyProjectName.MongoDB.Tests.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj index 0ec8bf147b..9cef5098e7 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/MyCompanyName.MyProjectName.TestBase.csproj @@ -4,6 +4,7 @@ net7.0 + enable MyCompanyName.MyProjectName diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Samples/SampleRepository_Tests.cs b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Samples/SampleRepository_Tests.cs index 738c202b90..acfc4f7139 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Samples/SampleRepository_Tests.cs +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Samples/SampleRepository_Tests.cs @@ -19,8 +19,8 @@ public abstract class SampleRepository_Tests : MyProjectNameTest } [Fact] - public async Task Method1Async() + public Task Method1Async() { - + return Task.CompletedTask; } } diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs index 717ba2c324..45db4c6afe 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs @@ -13,30 +13,15 @@ public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor return GetPrincipal(); } - private ClaimsPrincipal _principal; - private ClaimsPrincipal GetPrincipal() { - if (_principal == null) - { - lock (this) - { - if (_principal == null) + return new ClaimsPrincipal(new ClaimsIdentity(new List { - _principal = new ClaimsPrincipal( - new ClaimsIdentity( - new List - { - new Claim(AbpClaimTypes.UserId,"2e701e62-0953-4dd3-910b-dc6cc93ccb0d"), - new Claim(AbpClaimTypes.UserName,"admin"), - new Claim(AbpClaimTypes.Email,"admin@abp.io") - } - ) - ); + new Claim(AbpClaimTypes.UserId, "2e701e62-0953-4dd3-910b-dc6cc93ccb0d"), + new Claim(AbpClaimTypes.UserName, "admin"), + new Claim(AbpClaimTypes.Email, "admin@abp.io") } - } - } - - return _principal; + ) + ); } } diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs b/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs index 21124d6400..c089f1f00a 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs +++ b/templates/wpf/src/MyCompanyName.MyProjectName/App.xaml.cs @@ -12,9 +12,9 @@ namespace MyCompanyName.MyProjectName; /// public partial class App : Application { - private IAbpApplicationWithInternalServiceProvider _abpApplication; + private IAbpApplicationWithInternalServiceProvider? _abpApplication; - protected async override void OnStartup(StartupEventArgs e) + protected override async void OnStartup(StartupEventArgs e) { Log.Logger = new LoggerConfiguration() #if DEBUG @@ -48,9 +48,12 @@ public partial class App : Application } } - protected async override void OnExit(ExitEventArgs e) + protected override async void OnExit(ExitEventArgs e) { - await _abpApplication.ShutdownAsync(); + if (_abpApplication != null) + { + await _abpApplication.ShutdownAsync(); + } Log.CloseAndFlush(); } } diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index 0f3b9ee973..4329eec058 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -5,6 +5,7 @@ WinExe net7.0-windows + enable true From 8a28313b14739722e9712966e6ba0230e90178e1 Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 29 Nov 2022 11:21:42 +0300 Subject: [PATCH 40/86] Update Post.md --- docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md b/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md index 52fc9be63d..3729cfc8d1 100644 --- a/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md +++ b/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md @@ -1,6 +1,8 @@ # Rate Limiting with ASP.NET Core 7.0 -Rate limiting is a way of controlling traffic so that a web application or API receives. In other words, rate limiting helps you control the amount of traffic each user has access to at any given time. This is extremely useful when you want to manage the load on your server or services, avoid going over your monthly data transfer limit and allow the system to continue to function and meet service level agreements, even when an increase in demand places an extreme load on resources. In this article, we will look at why you need to use rate limiting, how the different rate limiting algorithms provided with .NET 7.0 work, and best practices for using rate limiting in your application. +Rate limiting is a way of controlling traffic so that a web application or API receives. In other words, rate limiting helps you control the amount of traffic each user has access to at any given time. This is extremely useful when you want to manage the load on your server or services, avoid going over your monthly data transfer limit and allow the system to continue to function and meet service level agreements, even when an increase in demand places an extreme load on resources. + +In this article, we will look at what is rate limiting, why we need to use it, how the different rate limiting algorithms provided with .NET 7.0 work, and best practices for using rate limiting in your application. ## What is rate limiting? From 07a921513e07acb087d97c7c34ac87204705c26a Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Tue, 29 Nov 2022 11:31:06 +0300 Subject: [PATCH 41/86] ADd CmsKit breaking-change into the docs --- docs/en/Migration-Guides/Abp-7_0.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index 3b6b1c5e6a..7c3a0d90b5 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -101,3 +101,11 @@ See https://github.com/abpframework/abp/pull/13644 for more info. We've already done this for our themes. See https://github.com/abpframework/abp/pull/13845 for more info. + +## Replaced `BlogPostPublicDto` with `BlogPostCommonDto` + +- In the CMS Kit Module, `BlogPostPublicDto` has been moved to `Volo.CmsKit.Common.Application.Contracts` from `Volo.CmsKit.Public.Application.Contracts` and renamed to `BlogPostCommonDto`. + +- See the [PR#13499](https://github.com/abpframework/abp/pull/13499) for more information. + +> You can ignore this if you don't use CMS Kit Module. \ No newline at end of file From 8c0014b7b440ff972a8dcdad4307e149465b271e Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Tue, 29 Nov 2022 11:57:41 +0300 Subject: [PATCH 42/86] quick fix --- .../2022-11-29-Rate-Limiting/Post.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md b/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md index 3729cfc8d1..aadb2dd99a 100644 --- a/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md +++ b/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md @@ -1,14 +1,14 @@ # Rate Limiting with ASP.NET Core 7.0 -Rate limiting is a way of controlling traffic so that a web application or API receives. In other words, rate limiting helps you control the amount of traffic each user has access to at any given time. This is extremely useful when you want to manage the load on your server or services, avoid going over your monthly data transfer limit and allow the system to continue to function and meet service level agreements, even when an increase in demand places an extreme load on resources. +Rate limiting is a way of controlling the traffic that a web application or API receives. In other words, rate limiting helps you control the amount of traffic each user has access to at any given time. This is extremely useful when you want to manage the load on your server or services, avoid going over your monthly data transfer limit and allow the system to continue to function and meet service level agreements, even when an increase in demand places an extreme load on resources. -In this article, we will look at what is rate limiting, why we need to use it, how the different rate limiting algorithms provided with .NET 7.0 work, and best practices for using rate limiting in your application. +In this article, we will look at what rate limiting is, why we need to use it, how the different rate limiting algorithms provided with .NET 7.0 work, and best practices for using rate limiting in your application. ## What is rate limiting? Whether accidental or intentional, users may exhaust resources in a way that impacts others. When a number of requests are received on to resources for a long time, the server can run out of those resources. These resources can include memory, threads, connections, or anything else that is limited. To avoid this situation, set rate limiters. Rate limiters control the consumption of resources used by an instance of an application, a user, an individual tenant, or an entire service. -## Why you need to use rate limiting? +## Why do you need to use rate limiting? A rate limiting system is crucial in any application where you have to control or throttle user requests or traffic. This is especially true in applications running on a cloud hosting platform because the user’s traffic can affect the whole server where the application is hosted. @@ -23,15 +23,15 @@ Why do you need to implement rate limiting? Here are a few reasons: The [`RateLimiterOptionsExtensions`](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.ratelimiting.ratelimiteroptionsextensions) class provides the following extension methods for rate limiting: - **[Fixed window](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#fixed-window-limit)**: Fixed-window limits—such as 3,000 requests per hour or 10 requests per day—are easy to state, but they are subject to spikes at the edges of the window, as available quota resets. Consider, for example, a limit of 3,000 requests per hour, which still allows for a spike of all 3,000 requests to be made in the first minute of the hour, which might overwhelm the service. -- [**Sliding window**:](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#sliding-window-limit) Sliding windows have the benefits of a fixed window, but the rolling window of time smooths out bursts. Systems such as Redis facilitate this technique with expiring keys. +- [**Sliding window**:](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#sliding-window-limit) Sliding windows have the benefits of a fixed window, but the rolling window of time smoothes out bursts. Systems such as Redis facilitate this technique with expiring keys. - [**Token bucket**](https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet/#token-bucket-limit): A token bucket maintains a rolling and accumulating budget of usage as a balance of tokens. A token bucket adds tokens at some rate. When a service request is made, the service attempts to withdraw a token (decrementing the token count) to fulfill the request. If there are no tokens in the bucket, the service has reached its limit and responds with backpressure. - [**Concurrency**](https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0#concurrency-limiter): A concurrency limiter is the simplest form of rate limiting. It doesn’t look at time, just at number of concurrent requests. -In order to be more realistic example, instead of making an example with each rate limiter algorithm, we will implement the following three algorithms in a **ABP-based** application. +In order to be a more realistic example, instead of making an example with each rate limiter algorithm, we will implement the following three algorithms in an **ABP-based** application. 1. We will add a `SlidingWindowLimiter` with a partition for all anonymous users. 2. We will add a `TokenBucketRateLimiter` with a partition for each authenticated user. -3. We will add `ConcurrencyLimiter` with a partition for each Tenant. +3. We will add a `ConcurrencyLimiter` with a partition for each Tenant. **Note:** The following sample isn't meant for production code but is an example of how to use the limiters in ABP-based applications. @@ -39,7 +39,7 @@ In order to be more realistic example, instead of making an example with each ra #### Add rate limiter -Let's create the following method in `MyProjectNameWebModule.cs` class in `MyProjectName.Web` project. +Let's create the following method in the `MyProjectNameWebModule.cs` class in the `MyProjectName.Web` project. **Note:** If the `**.Web` project is not in your application, you can do the same in the project where your application is hosted. @@ -112,7 +112,7 @@ private void ConfigureRateLimiters(ServiceConfigurationContext context) } ``` -In the above example, `TokenBucketLimiter` is used for each authenticated user, while `SlidingWindowLimiter` is used all anonymous user. Additionally, as a global limiter, `ConcurrencyLimiter` is used for each tenant, while rate limiting is disabled for the host(tenant is not available). Also, for requests that are rejected when the limit is reached, sets the response status code to [429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) and the response mentions when to retry (if available from the rate-limiting metadata). +In the above example, the `TokenBucketLimiter` is used for each authenticated user, while the `SlidingWindowLimiter` is used for all anonymous users. Additionally, as a global limiter, the `ConcurrencyLimiter` is used for each tenant, while rate limiting is disabled for the host(tenant is not available). Also, for requests that are rejected when the limit is reached, sets the response status code to [429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) and the response mentions when to retry (if available from the rate-limiting metadata). Let's call the `ConfigureRateLimiters` method that we created in the `ConfigureServices` method. @@ -171,16 +171,16 @@ app.UseConfiguredEndpoints(endpoints => }); ``` -- **DisableRateLimiting:** It is used to disable `ConcurrencyLimiter` for razor pages, which we set globally when tenant is available. +- **DisableRateLimiting:** It is used to disable the `ConcurrencyLimiter` for razor pages, which we set globally when the tenant is available. - **RequireRateLimiting:** We have enabled the rate limiter, which we define according to whether the user is authenticated or not, for all controllers. ## `EnableRateLimiting` and `DisableRateLimiting` attributes -It's kind of unrealistic to always use rate limiting for all controllers or pages. Many times, we may want to throttle a particular endpoint or page. In such cases, we can use the `EnableRateLimiting` and `DisableRateLimiting` attributes. The `EnableRateLimiting` and `DisableRateLimiting` attributes can be applied to a controller, action method, or razor rage. Check [here](https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0#enableratelimiting-and-disableratelimiting-attributes) for more. +It's kind of unrealistic to always use rate limiting for all controllers or pages. We may want to throttle a particular endpoint or page many times. In such cases, we can use the `EnableRateLimiting` and `DisableRateLimiting` attributes. The `EnableRateLimiting` and `DisableRateLimiting` attributes can be applied to a controller, action method, or razor rage. Check [here](https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0#enableratelimiting-and-disableratelimiting-attributes) for more. ## Rate limit an HTTP handler -Rate limiting when sending an HTTP request can be good practice, especially in service-to-service communication. Because, resources are consumed by apps that rely on them, and when an app makes too many requests for a single resource, it can lead to *resource contention*. Resource contention occurs when a resource is consumed by too many clients, and the resource is unable to serve all of the apps that are requesting it. This can result in a poor user experience, and in some cases, it can even lead to a denial of service (DoS) attack. Since there are similar codes, I will not mention an example in this article, but to avoid such situations, you can write your own HTTP handler like [here](https://learn.microsoft.com/en-us/dotnet/core/extensions/http-ratelimiter#implement-a-delegatinghandler-subclass). +Rate limiting when sending an HTTP request can be a good practice, especially in service-to-service communication. Because, resources are consumed by apps that rely on them, and when an app makes too many requests for a single resource, it can lead to *resource contention*. Resource contention occurs when a resource is consumed by too many clients, and the resource is unable to serve all of the apps that are requesting it. This can result in a poor user experience, and in some cases, it can even lead to a denial of service (DoS) attack. Since there are similar codes, I will not mention an example in this article, but to avoid such situations, you can write your own HTTP handler as [here](https://learn.microsoft.com/en-us/dotnet/core/extensions/http-ratelimiter#implement-a-delegatinghandler-subclass). ## How does it work? @@ -200,20 +200,20 @@ public abstract class RateLimiter : IAsyncDisposable, IDisposable } ``` -`RateLimiter` contains `Acquire` and `WaitAsync` as the core methods for trying to gain permits for a resource that is being protected. Depending on the application the protected resource may need to acquire more than 1 permits, so `Acquire` and `WaitAsync` both accept an optional `permitCount` parameter. `Acquire` is a synchronous method that will check if enough permits are available or not and return a `RateLimitLease` which contains information about whether you successfully acquired the permits or not. `WaitAsync` is similar to `Acquire` except that it can support queuing permit requests which can be de-queued at some point in the future when the permits become available, which is why it’s asynchronous and accepts an optional `CancellationToken` to allow canceling the queued request. +`RateLimiter` contains `Acquire` and `WaitAsync` as the core methods for trying to gain permits for a resource that is being protected. Depending on the application, the protected resource may need to acquire more than 1 permits, so `Acquire` and `WaitAsync` both accept an optional `permitCount` parameter. `Acquire` is a synchronous method that will check if enough permits are available or not and return a `RateLimitLease` which contains information about whether you successfully acquired the permits or not. `WaitAsync` is similar to `Acquire` except that it can support queuing permit requests which can be de-queued at some point in the future when the permits become available, which is why it’s asynchronous and accepts an optional `CancellationToken` to allow canceling the queued request. `RateLimitLease` has an `IsAcquired` property which is used to see if the permits were acquired. Additionally, the `RateLimitLease` may contain metadata such as a suggested retry-after period if the lease failed. Finally, the `RateLimitLease` is disposable and should be disposed when the code is done using the protected resource. The disposal will let the `RateLimiter` know to update its limits based on how many permits were acquired. ## Limitations -In most cases, the rate-limiting middleware provided with ASP.NET 7.0 will meet your requirements. However, if you would want to return statistics about your limits (e.g. [like GitHub does](https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#rate-limit-http-headers)), you’ll find the ASP.NET rate limiting middleware does not support this. You won’t have access to the “number of requests remaining” or other metadata. Not in `OnRejected`, and definitely not if you want to return this data as headers on every request. +In most cases, the rate-limiting middleware provided with ASP.NET 7.0 will meet your requirements. However, if you would want to return statistics about your limits (e.g. [the way GitHub does](https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#rate-limit-http-headers)), you’ll find out that the ASP.NET rate limiting middleware does not support this. You won’t have access to the “number of requests remaining” or other metadata. Not in `OnRejected`, and definitely not if you want to return this data as headers on every request. ## Best practices for rate limiting In order to use rate limiting properly, you need to have a solid understanding of the types of limiting available, as well as the data rate and data volume of your service. You also need to have a clear idea of how many users you expect to use your service as well as how they will interact with it. The best practices for rate limiting are as follows: - Find the right rate limiter algorithm for your endpoint. I mean, the cost of an endpoint should be considered when selecting a limiter. The cost of an endpoint includes the resources used, for example, time, data access, CPU, and I/O. - Set realistic limits. Once you’ve figured out all the above, you need to set realistic limits for each service. Then, before deploying an app using rate limiting to production, stress test the app to validate the rate limiters and options used. For example, create a [JMeter script](https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html) with a tool like [BlazeMeter](https://guide.blazemeter.com/hc/articles/207421695-Writing-your-first-JMeter-script) or [Apache JMeter HTTP(S) Test Script Recorder](https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html) and load the script to [Azure Load Testing](https://learn.microsoft.com/en-us/azure/load-testing/overview-what-is-azure-load-testing). -- In response to rate-limiting, intermittent, or non-specific errors, a client should generally retry the request after a delay. It is a best practice for this delay to increase exponentially after each failed request, which is referred to as *exponential backoff*. When many clients might be making schedule-based requests (such as fetching results every hour), additional random time (*jitter*) should be applied to the request timing, the backoff period, or both to ensure that these multiple client instances don't become periodic [thundering herd](https://www.wikiwand.com/en/Thundering_herd_problem), and themselves cause a form of DDoS. +- In response to rate-limiting, intermittent, or non-specific errors, a client should generally retry the request after a delay. It is a best practice for this delay to increase exponentially after each failed request, which is referred to as *exponential backoff*. When many clients might be making schedule-based requests (such as fetching results every hour), additional random time (*jitter*) should be applied to the request timing, the backoff period, or both of them to ensure that these multiple client instances don't become periodic [thundering herd](https://www.wikiwand.com/en/Thundering_herd_problem), and cause a form of DDoS themselves. ## Conclusion @@ -228,4 +228,4 @@ In this article, we’ve covered what rate limiting is, why you need to use it a - https://learn.microsoft.com/en-us/azure/architecture/patterns/rate-limiting-pattern - https://learn.microsoft.com/en-us/azure/architecture/patterns/throttling - https://devblogs.microsoft.com/dotnet/announcing-rate-limiting-for-dotnet -- https://cloud.google.com/architecture/rate-limiting-strategies-techniques \ No newline at end of file +- https://cloud.google.com/architecture/rate-limiting-strategies-techniques From d9b6f694ab86e5eed1b55cece35f13dae5ba090d Mon Sep 17 00:00:00 2001 From: Berkan Sasmaz Date: Tue, 29 Nov 2022 12:08:57 +0300 Subject: [PATCH 43/86] Update Post.md --- docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md b/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md index aadb2dd99a..d26f6c4aaa 100644 --- a/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md +++ b/docs/en/Community-Articles/2022-11-29-Rate-Limiting/Post.md @@ -176,7 +176,7 @@ app.UseConfiguredEndpoints(endpoints => ## `EnableRateLimiting` and `DisableRateLimiting` attributes -It's kind of unrealistic to always use rate limiting for all controllers or pages. We may want to throttle a particular endpoint or page many times. In such cases, we can use the `EnableRateLimiting` and `DisableRateLimiting` attributes. The `EnableRateLimiting` and `DisableRateLimiting` attributes can be applied to a controller, action method, or razor rage. Check [here](https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0#enableratelimiting-and-disableratelimiting-attributes) for more. +It's kind of unrealistic to always use rate limiting for all controllers or pages. Sometimes, we may want to throttle a particular endpoint or page. In such cases, we can use the `EnableRateLimiting` and `DisableRateLimiting` attributes. The `EnableRateLimiting` and `DisableRateLimiting` attributes can be applied to a controller, action method, or razor rage. Check [here](https://learn.microsoft.com/en-us/aspnet/core/performance/rate-limit?preserve-view=true&view=aspnetcore-7.0#enableratelimiting-and-disableratelimiting-attributes) for more. ## Rate limit an HTTP handler From 0d4706ef6f6aa1d057fd4e10c67922c6c3449966 Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Tue, 29 Nov 2022 05:20:12 -0500 Subject: [PATCH 44/86] added article --- .../2022-11-29-EF-Core-Guarded-Types/POST.md | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md diff --git a/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md b/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md new file mode 100644 index 0000000000..2d9c21d803 --- /dev/null +++ b/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md @@ -0,0 +1,205 @@ +# Value generation for DDD guarded types with Entity Framework Core 7.0 + +In domain-driven design (DDD), *guarded keys* can improve the type safety of key properties. This is achieved by wrapping the key type in another type which is specific to the use of the key. In this article, I will explain the cases why you may need to use use guarded types and discuss the advantages and limitations when implementing to an ABP application. + +> You can find the source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreGuardedTypeDemo). + +## The Problem + +While developing an applications, there are many cases where we manually assign foreign keys that can be in guid type or integer type, etc. This manual assignment mistakes can cause miss-match of unique identifiers, such as **assigning a product ID to a category**, that can be hard to detect in the future. + +Here is a very simplified sample of wrong assignment when trying to update a product category: + +````csharp +public class ProductAppService : MyProductStoreAppService, IProductAppService +{ + private readonly IRepository _productRepository; + + public ProductAppService(IRepository productRepository) + { + _productRepository = productRepository; + } + + public async Task UpdateProductCategoryAsync(Guid productId, Guid categoryId) + { + var productToUpdate = await _productRepository.GetAsync(productId); + productToUpdate.CategoryId = productId; // Wrong assignment that causes error only at run-time + + await _productRepository.UpdateAsync(productToUpdate); + } +} +```` + +While the sample demonstrates a very simple mistake, whilst the business logic get more complex, it is easier to come across mistakes similar to this one. The next section offers using guarded types to prevent these kind of problems as a solution to the problem. + +## The Solution + +With EFCore7, key properties can be guarded with type safety. To use that, update your aggreagate root or entity unique identifier with a complex object. + +````csharp +public struct CategoryId +{ + public CategoryId(Guid value) => Value = value; + public Guid Value { get; } +} + +public readonly struct ProductId +{ + public ProductId(Guid value) => Value = value; + public Guid Value { get; } +} +```` + +> It is worth considering as with many [Domain-Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design) (DDD) concepts, this improved type safety comes with additional code complexity. + +You can now use these keys for your aggregate roots or entities: + +```csharp +public class Product : AggregateRoot +{ + public ProductId Id { get; set; } + public string Name { get; set; } + public CategoryId CategoryId { get; set; } + + private Product() { } + + public Product(ProductId id, string name) : base(id) + { + Name = Check.NotNullOrEmpty(name, nameof(name)); + } +} + +public class Category : AggregateRoot +{ + public CategoryId Id { get; set; } + public string Name { get; set; } + public List Products { get; } = new(); + + private Category() { } + + public Category(CategoryId id, string name) : base(id) + { + Name = Check.NotNullOrEmpty(name, nameof(name)); + } +} +``` + +`ProductId` and `CategoryId` guarded key types shown in the sample use `Guid` key values, which means Guid values will be used in the mapped database tables. This is achieved by defining [value converters](https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions) for the types. Override the `ConfigureConventions` method of your DbContext to use the value converters: + +````csharp +protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) +{ + configurationBuilder.Properties().HaveConversion(); + configurationBuilder.Properties().HaveConversion(); +} + +private class ProductIdConverter : ValueConverter +{ + public ProductIdConverter() + : base(v => v.Value, v => new(v)) + { + } +} + +private class CategoryIdConverter : ValueConverter +{ + public CategoryIdConverter() + : base(v => v.Value, v => new(v)) + { + } +} +```` + +> The code here uses `struct` types. This means they have appropriate value-type semantics for use as keys. If `class` types are used instead, then they need to either override equality semantics or also specify a [value comparer](https://learn.microsoft.com/en-us/ef/core/modeling/value-comparers). + +Now, you can use generic (or custom) repositories of ABP using the guarded type as the key for the repository: + +```csharp +public class ProductStoreDataSeedContributor : IDataSeedContributor, ITransientDependency +{ + private readonly IRepository _categoryRepository; + private readonly IRepository _productRepository; + + public ProductStoreDataSeedContributor( + IRepository categoryRepository, + IRepository productRepository + ) + { + _categoryRepository = categoryRepository; + _productRepository = productRepository; + } + + // ... +} +``` + +You can also use `integer` as guarded type for your key properties and use [Sequence-based key generation for SQL Server](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#sequence-based-key-generation-for-sql-server). + +## Discussions + +In this section, I will discuss the use cases of guarded types and limitations when implementing to an ABP application. + +### Do I need guarded type key properties even if I follow DDD principles? + +While using strongly-typed key properties reduce the chance of unnoticed errors, admittedly it increases the code complexity by adding new types to your solution. If you are already following the best practices of [Domain-Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design), you are aware that **updates** and **creations** of an aggregate are done **over** the aggregate root itself as a whole unit. And entity state changes of an aggregate root can be done using the [domain services](https://docs.abp.io/en/abp/latest/Domain-Services). Domain services should already validate the entity. + +**Example: Using domain service to update product:** + +````csharp +public class ProductManager : DomainService +{ + private readonly IRepository _productRepository; + + public ProductManager(IRepository productRepository) + { + _productRepository = productRepository; + } + + public Task AssignCategory(Product product, Category category) + { + // ... + + product.CategoryId = category.Id; + + //.. + } +} +```` + +In this sample, domain service validates that both **product** and the **category** entities, passed by the application layer, are valid objects since they are not key properties. However, manual assignment is already in place and more complex the domain logic, higher to miss out mistakes. + +### Limitations + +One important limitation is automatic value generation when using `Guid` as guarded type for your key properties. The basic repository can not generate the unique identifier automatically by the time this article is written: + +```csharp +public readonly struct ProductId +{ + public ProductId(Guid value) => Value = value; + public Guid Value { get; } +} +``` + +you need to generate the unique identifier **manually**: + +````csharp +var newProduct = await _productRepository.InsertAsync( + new Product(new ProductId(_guidGenerator.Create()), "New product") +); +```` + +## Conclusion + +In this article, I tried to explain DDD guarded types for key properties and value generation for these properties using Entity Framework 7.0 and ABP. + +As in many DDD concepts and patterns, guarded types provides improved safety for your code base at the expense of additional code complexity. If you have a large team working on a large scale solution containing complex business logics where key assignments are abundant, I personally suggest using guarded types. + +## The Source Code + +* You can find the full source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreGuardedTypeDemo). +* You can see [this pull request](https://github.com/abpframework/abp-samples/pull/207/files) for the changes I've done after creating the application. + +## See Also + +* [What's new in EF Core 7.0](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew) +* [ABP Framework: Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design) \ No newline at end of file From 4b80ae24cea006410a9bcbb298cbb1f79b181f53 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 29 Nov 2022 15:04:52 +0300 Subject: [PATCH 45/86] Removed tenantId from filtering --- .../Volo/Abp/Identity/IIdentityUserRepository.cs | 2 -- .../EfCoreIdentityUserRepository.cs | 12 ++++-------- .../Identity/MongoDB/MongoIdentityUserRepository.cs | 12 ++++-------- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs index f6b2550e9f..d2a049dd84 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs @@ -58,7 +58,6 @@ public interface IIdentityUserRepository : IBasicRepository bool includeDetails = false, Guid? roleId = null, Guid? organizationUnitId = null, - Guid? tenantId = null, string userName = null, string phoneNumber = null, string emailAddress = null, @@ -104,7 +103,6 @@ public interface IIdentityUserRepository : IBasicRepository string filter = null, Guid? roleId = null, Guid? organizationUnitId = null, - Guid? tenantId = null, string userName = null, string phoneNumber = null, string emailAddress = null, diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index c311397e1e..c543201bf2 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -139,7 +139,6 @@ public class EfCoreIdentityUserRepository : EfCoreRepository identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf(tenantId.HasValue, identityUser => identityUser.TenantId == tenantId) .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) @@ -180,8 +178,8 @@ public class EfCoreIdentityUserRepository : EfCoreRepository x.IsExternal) .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) - .WhereIf(minModifitionTime != null, p => p.LastModificationTime <= minModifitionTime) + .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) + .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(IdentityUser.UserName) : sorting) .PageBy(skipCount, maxResultCount) .ToListAsync(GetCancellationToken(cancellationToken)); @@ -222,7 +220,6 @@ public class EfCoreIdentityUserRepository : EfCoreRepository identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf(tenantId.HasValue, identityUser => identityUser.TenantId == tenantId) .WhereIf(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) .WhereIf(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) @@ -262,8 +258,8 @@ public class EfCoreIdentityUserRepository : EfCoreRepository x.IsExternal) .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) - .WhereIf(minModifitionTime != null, p => p.LastModificationTime <= minModifitionTime) + .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) + .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) .LongCountAsync(GetCancellationToken(cancellationToken)); } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index d4a9e05cc3..000b6e68d7 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -140,7 +140,6 @@ public class MongoIdentityUserRepository : MongoDbRepository>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf>(tenantId.HasValue, identityUser => identityUser.TenantId == tenantId.Value) .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) @@ -180,8 +178,8 @@ public class MongoIdentityUserRepository : MongoDbRepository>(isExternal == true, x => x.IsExternal) .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) - .WhereIf(minModifitionTime != null, p => p.LastModificationTime <= minModifitionTime) + .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) + .WhereIf(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) .OrderBy(sorting.IsNullOrWhiteSpace() ? nameof(IdentityUser.UserName) : sorting) .As>() .PageBy>(skipCount, maxResultCount) @@ -226,7 +224,6 @@ public class MongoIdentityUserRepository : MongoDbRepository>(roleId.HasValue, identityUser => identityUser.Roles.Any(x => x.RoleId == roleId.Value)) .WhereIf>(organizationUnitId.HasValue, identityUser => identityUser.OrganizationUnits.Any(x => x.OrganizationUnitId == organizationUnitId.Value)) - .WhereIf>(tenantId.HasValue, identityUser => identityUser.TenantId == tenantId.Value) .WhereIf>(!string.IsNullOrWhiteSpace(userName), x => x.UserName == userName) .WhereIf>(!string.IsNullOrWhiteSpace(phoneNumber), x => x.PhoneNumber == phoneNumber) .WhereIf>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) @@ -266,8 +262,8 @@ public class MongoIdentityUserRepository : MongoDbRepository>(isExternal == true, x => x.IsExternal) .WhereIf>(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf>(minCreationTime != null, p => p.CreationTime >= minCreationTime) - .WhereIf>(maxModifitionTime != null, p => p.LastModificationTime >= maxModifitionTime) - .WhereIf>(minModifitionTime != null, p => p.LastModificationTime <= minModifitionTime) + .WhereIf>(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) + .WhereIf>(minModifitionTime != null, p => p.LastModificationTime >= minModifitionTime) .LongCountAsync(GetCancellationToken(cancellationToken)); } From 0d891aca7a3d240defef1bd3bfdf0465313e1e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 29 Nov 2022 16:31:27 +0300 Subject: [PATCH 46/86] Revision for the dependency injection document --- docs/en/Dependency-Injection.md | 53 +++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index bfce8a71bf..147ef1689a 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -2,7 +2,7 @@ ABP's Dependency Injection system is developed based on Microsoft's [dependency injection extension](https://medium.com/volosoft/asp-net-core-dependency-injection-best-practices-tips-tricks-c6e9c67f9d96) library (Microsoft.Extensions.DependencyInjection nuget package). So, it's documentation is valid in ABP too. -> While ABP has no core dependency to any 3rd-party DI provider, it's required to use a provider that supports dynamic proxying and some other advanced features to make some ABP features properly work. Startup templates come with Autofac installed. See [Autofac integration](Autofac-Integration.md) document for more information. +> While ABP has no core dependency to any 3rd-party DI provider. However, it's required to use a provider that supports dynamic proxying and some other advanced features to make some ABP features properly work. Startup templates come with [Autofac](https://autofac.org/) installed. See [Autofac integration](Autofac-Integration.md) document for more information. ## Modularity @@ -20,24 +20,24 @@ public class BlogModule : AbpModule ## Conventional Registration -ABP introduces conventional service registration. You need not do anything to register a service by convention. It's automatically done. If you want to disable it, you can set `SkipAutoServiceRegistration` to `true` by overriding the `PreConfigureServices` method. +ABP introduces conventional service registration. You need not do anything to register a service by convention. It's automatically done. If you want to disable it, you can set `SkipAutoServiceRegistration` to `true` in the constructor of your module class. Example: ````C# public class BlogModule : AbpModule { - public override void PreConfigureServices(ServiceConfigurationContext context) + public BlogModule() { SkipAutoServiceRegistration = true; } } ```` -Once you skip auto registration, you should manually register your services. In that case, ``AddAssemblyOf`` extension method can help you to register all your services by convention. Example: +Once you skip the auto registration, you should manually register your services. In that case, ``AddAssemblyOf`` extension method can help you to register all your services by convention. Example: ````c# public class BlogModule : AbpModule { - public override void PreConfigureServices(ServiceConfigurationContext context) + public BlogModule() { SkipAutoServiceRegistration = true; } @@ -105,9 +105,7 @@ Example: [Dependency(ServiceLifetime.Transient, ReplaceServices = true)] public class TaxCalculator { - } - ```` ``Dependency`` attribute has a higher priority than other dependency interfaces if it defines the ``Lifetime`` property. @@ -120,7 +118,6 @@ public class TaxCalculator [ExposeServices(typeof(ITaxCalculator))] public class TaxCalculator: ICalculator, ITaxCalculator, ICanCalculate, ITransientDependency { - } ```` @@ -179,7 +176,11 @@ public class MyModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { //Replacing the IConnectionStringResolver service - context.Services.Replace(ServiceDescriptor.Transient()); + context.Services.Replace( + ServiceDescriptor.Transient< + IConnectionStringResolver, + MyConnectionStringResolver + >()); } } ```` @@ -202,7 +203,7 @@ public class TaxAppService : ApplicationService _taxCalculator = taxCalculator; } - public void DoSomething() + public async Task DoSomethingAsync() { //...use _taxCalculator... } @@ -227,7 +228,7 @@ public class MyService : ITransientDependency Logger = NullLogger.Instance; } - public void DoSomething() + public async Task DoSomethingAsync() { //...use Logger to write logs... } @@ -244,17 +245,21 @@ One restriction of property injection is that you cannot use the dependency in y Property injection is also useful when you want to design a base class that has some common services injected by default. If you're going to use constructor injection, all derived classes should also inject depended services into their own constructors which makes development harder. However, be very careful using property injection for non-optional services as it makes it harder to clearly see the requirements of a class. -#### DisablePropertyInjectionAttribute +#### DisablePropertyInjection Attribute -You can use `[DisablePropertyInjection]` attribute on class or properties to disable property injection for the whole class or some specific properties. +You can use `[DisablePropertyInjection]` attribute on classes or their properties to disable property injection for the whole class or some specific properties. ````C# +// Disabling for all properties of the MyService class [DisablePropertyInjection] public class MyService : ITransientDependency { + public ILogger Logger { get; set; } + public ITaxCalculator TaxCalculator { get; set; } } +// Disabling only for the TaxCalculator property public class MyService : ITransientDependency { public ILogger Logger { get; set; } @@ -262,17 +267,21 @@ public class MyService : ITransientDependency [DisablePropertyInjection] public ITaxCalculator TaxCalculator { get; set; } } - ```` ### Resolve Service from IServiceProvider -You may want to resolve a service directly from ``IServiceProvider``. In that case, you can inject IServiceProvider into your class and use ``GetService`` method as shown below: +You may want to resolve a service directly from ``IServiceProvider``. In that case, you can inject `IServiceProvider` into your class and use the ``GetService`` or the `GetRequiredService` method as shown below: ````C# public class MyService : ITransientDependency { - public ILogger Logger { get; set; } + private readonly ITaxCalculator _taxCalculator; + + public MyService(IServiceProvider serviceProvider) + { + _taxCalculator = serviceProvider.GetRequiredService(); + } } ```` @@ -374,15 +383,15 @@ IEnumerable services = _serviceProvider.GetServices Date: Tue, 29 Nov 2022 10:59:24 -0500 Subject: [PATCH 47/86] removed pr section --- .../Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md b/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md index 2d9c21d803..417d4a2731 100644 --- a/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md +++ b/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md @@ -197,7 +197,6 @@ As in many DDD concepts and patterns, guarded types provides improved safety for ## The Source Code * You can find the full source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreGuardedTypeDemo). -* You can see [this pull request](https://github.com/abpframework/abp-samples/pull/207/files) for the changes I've done after creating the application. ## See Also From 777aca28e3a49012667ee4f722920db57d67982c Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Tue, 29 Nov 2022 23:42:45 +0300 Subject: [PATCH 48/86] Update POST.md --- .../2022-11-28-ef-bulk-operations/POST.md | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md index edf88bfcaa..ac517506ec 100644 --- a/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md +++ b/docs/en/Community-Articles/2022-11-28-ef-bulk-operations/POST.md @@ -9,11 +9,17 @@ With .NET 7, there are two new methods such as `ExecuteUpdate` and `ExecuteDelet You can visit the microsoft example [here](https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#executeupdate-and-executedelete-bulk-updates) about how to use it. -ABP Framework supports Entity Framework Core as its ORM. So, you can use these new methods in your repository classes in your ABP applications without any limitation. -## Usage in Repositories +It can be easily used with the DbContext. -You can use these methods in your repositories as below: +```csharp +await context.Tags.Where(t => t.Text.Contains(".NET")).ExecuteDeleteAsync(); +``` + +## Using with ABP Framework +ABP Framework provides an abstraction over database operations and implements generic repository pattern. So, DbContext can't be accessed outside of [repositories](https://docs.abp.io/en/abp/latest/Repositories). + +You can use the `ExecuteUpdate` and `ExecuteDelete` methods inside a repository. ```csharp public class BookEntityFrameworkCoreRepository : EfCoreRepository, IBookRepository @@ -42,6 +48,24 @@ public class BookEntityFrameworkCoreRepository : EfCoreRepository There is no need to take an action for bulk inserting. You can use the `InsertManyAsync` method of the repository instead of creating a new method for it if you don't have custom logic. It'll use a new bulk inserting feature automatically since it's available in EF Core 7.0. +There is no need to take an action for bulk inserting. You can use the `InsertManyAsync` method of the repository instead of creating a new method for it if you don't have custom logic. It'll use a new bulk inserting feature automatically since it's available in EF Core 7.0. + +```csharp +public class MyDomainService : DomainService +{ + protected IRepository BookRepository { get; } + + public MyDomainService(IRepository bookRepository) + { + BookRepository = bookRepository; + } + + public async Task CreateBooksAsync(List books) + { + // It'll use bulk inserting automatically. + await BookRepository.InsertManyAsync(books); + } +} +``` -> If you use `ExecuteDeleteAsync` or `ExecuteUpdateAsync`, then ABP's soft delete and auditing features can not work. Because these ABP features work with EF Core's change tracking system and these new methods doesn't work with the change tracking system. So, use them carefully. \ No newline at end of file +> If you use `ExecuteDeleteAsync` or `ExecuteUpdateAsync`, then ABP's soft delete and auditing features can not work. Because these ABP features work with EF Core's change tracking system and these new methods doesn't work with the change tracking system. So, use them carefully. From 70b69590a1ab48810bd23a67a4fc19bf4eece142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 09:56:30 +0300 Subject: [PATCH 49/86] Fix AbpLazyServiceProvider.LazyGetRequiredService It should not return null, but throw exception if a service was not found. --- .../Abp/DependencyInjection/AbpLazyServiceProvider.cs | 2 +- .../Abp/DependencyInjection/CachedServiceProviderBase.cs | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs index 3aff8a78ad..7a18689dbe 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs @@ -17,7 +17,7 @@ public class AbpLazyServiceProvider : CachedServiceProviderBase, IAbpLazyService public virtual object LazyGetRequiredService(Type serviceType) { - return GetService(serviceType); + return GetRequiredService(serviceType); } public virtual T LazyGetService() diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs index c261d3a3bb..2116ec8fb7 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.DependencyInjection; @@ -22,4 +23,12 @@ public abstract class CachedServiceProviderBase _ => new Lazy(() => ServiceProvider.GetService(serviceType)) ).Value; } + + public virtual object GetRequiredService(Type serviceType) + { + return CachedServices.GetOrAdd( + serviceType, + _ => new Lazy(() => ServiceProvider.GetRequiredService(serviceType)) + ).Value; + } } From 39839ad5dfd532660dcef2b02449bb010d52c4ce Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Wed, 30 Nov 2022 01:59:44 -0500 Subject: [PATCH 50/86] Revision and grammar fix --- .../2022-11-29-EF-Core-Guarded-Types/POST.md | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md b/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md index 417d4a2731..53903e1ccc 100644 --- a/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md +++ b/docs/en/Community-Articles/2022-11-29-EF-Core-Guarded-Types/POST.md @@ -1,6 +1,6 @@ # Value generation for DDD guarded types with Entity Framework Core 7.0 -In domain-driven design (DDD), *guarded keys* can improve the type safety of key properties. This is achieved by wrapping the key type in another type which is specific to the use of the key. In this article, I will explain the cases why you may need to use use guarded types and discuss the advantages and limitations when implementing to an ABP application. +In domain-driven design (DDD), *guarded keys* can improve the type safety of key properties. This is achieved by wrapping the key type in another type which is specific to the use of the key. In this article, I will explain the cases why you may need to use guarded types and discuss the advantages and limitations when implementing to an ABP application. > You can find the source code of the example application [here](https://github.com/abpframework/abp-samples/tree/master/EfCoreGuardedTypeDemo). @@ -30,14 +30,16 @@ public class ProductAppService : MyProductStoreAppService, IProductAppService } ```` -While the sample demonstrates a very simple mistake, whilst the business logic get more complex, it is easier to come across mistakes similar to this one. The next section offers using guarded types to prevent these kind of problems as a solution to the problem. +While the sample demonstrates a very simple mistake, it is easier to come across similar mistakes when the business logic gets more complex especially when you are using methods with **multiple foreign key arguments**. The next section offers using guarded types to prevent these kind of problems as a solution to the problem. ## The Solution -With EFCore7, key properties can be guarded with type safety. To use that, update your aggreagate root or entity unique identifier with a complex object. +Strongly-typed IDs (*guarded keys*) is a DDD approach to address this problem. One of the main problems with .NET users was handling the persisting these objects. With EFCore7, key properties can be guarded with type safety seamlessly. + +To use guarded keys, update your aggregate root or entity unique identifier with a complex type to overcome *primitive obsession*: ````csharp -public struct CategoryId +public readonly struct CategoryId { public CategoryId(Guid value) => Value = value; public Guid Value { get; } @@ -50,8 +52,6 @@ public readonly struct ProductId } ```` -> It is worth considering as with many [Domain-Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design) (DDD) concepts, this improved type safety comes with additional code complexity. - You can now use these keys for your aggregate roots or entities: ```csharp @@ -84,7 +84,9 @@ public class Category : AggregateRoot } ``` -`ProductId` and `CategoryId` guarded key types shown in the sample use `Guid` key values, which means Guid values will be used in the mapped database tables. This is achieved by defining [value converters](https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions) for the types. Override the `ConfigureConventions` method of your DbContext to use the value converters: +`ProductId` and `CategoryId` guarded key types shown in the sample use `Guid` key values, which means Guid values will be used in the mapped database tables. This is achieved by defining [value converters](https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions) for the types. + +Override the `ConfigureConventions` method of your DbContext to use the value converters: ````csharp protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) @@ -133,15 +135,15 @@ public class ProductStoreDataSeedContributor : IDataSeedContributor, ITransientD } ``` -You can also use `integer` as guarded type for your key properties and use [Sequence-based key generation for SQL Server](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#sequence-based-key-generation-for-sql-server). +You can also use `integer` as guarded type for your key properties and use [Sequence-based key generation for SQL Server](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#sequence-based-key-generation-for-sql-server) for value generation. ## Discussions In this section, I will discuss the use cases of guarded types and limitations when implementing to an ABP application. -### Do I need guarded type key properties even if I follow DDD principles? +### Do I need to use guarded types? -While using strongly-typed key properties reduce the chance of unnoticed errors, admittedly it increases the code complexity by adding new types to your solution. If you are already following the best practices of [Domain-Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design), you are aware that **updates** and **creations** of an aggregate are done **over** the aggregate root itself as a whole unit. And entity state changes of an aggregate root can be done using the [domain services](https://docs.abp.io/en/abp/latest/Domain-Services). Domain services should already validate the entity. +If you are already following the best practices of [Domain-Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design), you are aware that **updates** and **creations** of an aggregate are done **over** the aggregate root itself as a whole unit. And entity state changes of an aggregate root should be done using the [domain services](https://docs.abp.io/en/abp/latest/Domain-Services). Domain services should already validate the entity. **Example: Using domain service to update product:** @@ -166,7 +168,7 @@ public class ProductManager : DomainService } ```` -In this sample, domain service validates that both **product** and the **category** entities, passed by the application layer, are valid objects since they are not key properties. However, manual assignment is already in place and more complex the domain logic, higher to miss out mistakes. +In this sample, domain service validates that both **product** and the **category** entities, passed by the application layer, are valid objects since they are not key properties. However, manual assignment is already in place and more complex the domain logic, higher to miss out mistakes. At the end, it will depend on your tolerance level for developer errors comparing to the time you want to spend time on additional code base for guarded types. ### Limitations @@ -192,7 +194,9 @@ var newProduct = await _productRepository.InsertAsync( In this article, I tried to explain DDD guarded types for key properties and value generation for these properties using Entity Framework 7.0 and ABP. -As in many DDD concepts and patterns, guarded types provides improved safety for your code base at the expense of additional code complexity. If you have a large team working on a large scale solution containing complex business logics where key assignments are abundant, I personally suggest using guarded types. +Using strongly-typed key properties reduce the chance of unnoticed errors. Admittedly it increases the code complexity by adding new types to your solution with extra coding, especially if you are using classes as keys. Guarded types provide improved safety for your code base at the expense of additional code complexity as in many DDD concepts and patterns. + +If you have a large team working on a large scale solution containing complex business logics where key assignments are abundant or if you are using methods with multiple foreign key arguments, I personally suggest using guarded types. ## The Source Code From 740312cc6720a07c01446f7a4d07bbaedf6c9e2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 10:45:00 +0300 Subject: [PATCH 51/86] Inherit IAbpLazyServiceProvider from IServiceProvider Provide methods without Lazy prefix. --- .../AbpLazyServiceProvider.cs | 46 ++++++++++++++---- .../CachedServiceProviderBase.cs | 10 +--- .../IAbpLazyServiceProvider.cs | 48 ++++++++++++++++++- 3 files changed, 84 insertions(+), 20 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs index 7a18689dbe..8af18416ff 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs @@ -1,15 +1,42 @@ using System; +using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.DependencyInjection; [ExposeServices(typeof(IAbpLazyServiceProvider))] -public class AbpLazyServiceProvider : CachedServiceProviderBase, IAbpLazyServiceProvider, ITransientDependency +public class AbpLazyServiceProvider : + CachedServiceProviderBase, + IAbpLazyServiceProvider, + ITransientDependency { public AbpLazyServiceProvider(IServiceProvider serviceProvider) : base(serviceProvider) { } + public T GetService(T defaultValue) + { + return (T)GetService(typeof(T), defaultValue); + } + + public object GetService(Type serviceType, object defaultValue) + { + return GetService(serviceType) ?? defaultValue; + } + + public T GetService(Func factory) + { + return (T)GetService(typeof(T), factory); + } + + public object GetService(Type serviceType, Func factory) + { + return CachedServices.GetOrAdd( + serviceType, + _ => new Lazy(() => factory(ServiceProvider)) + ).Value; + } + public virtual T LazyGetRequiredService() { return (T)LazyGetRequiredService(typeof(T)); @@ -17,7 +44,7 @@ public class AbpLazyServiceProvider : CachedServiceProviderBase, IAbpLazyService public virtual object LazyGetRequiredService(Type serviceType) { - return GetRequiredService(serviceType); + return this.GetRequiredService(serviceType); } public virtual T LazyGetService() @@ -30,26 +57,27 @@ public class AbpLazyServiceProvider : CachedServiceProviderBase, IAbpLazyService return GetService(serviceType); } + #region Old Methods + public virtual T LazyGetService(T defaultValue) { - return (T)LazyGetService(typeof(T), defaultValue); + return GetService(defaultValue); } public virtual object LazyGetService(Type serviceType, object defaultValue) { - return LazyGetService(serviceType) ?? defaultValue; + return GetService(serviceType, defaultValue); } public virtual T LazyGetService(Func factory) { - return (T)LazyGetService(typeof(T), factory); + return GetService(factory); } public virtual object LazyGetService(Type serviceType, Func factory) { - return CachedServices.GetOrAdd( - serviceType, - _ => new Lazy(() => factory(ServiceProvider)) - ).Value; + return GetService(serviceType, factory); } + + #endregion } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs index 2116ec8fb7..49da116fea 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.DependencyInjection; -public abstract class CachedServiceProviderBase +public abstract class CachedServiceProviderBase : IServiceProvider { protected IServiceProvider ServiceProvider { get; } protected ConcurrentDictionary> CachedServices { get; } @@ -23,12 +23,4 @@ public abstract class CachedServiceProviderBase _ => new Lazy(() => ServiceProvider.GetService(serviceType)) ).Value; } - - public virtual object GetRequiredService(Type serviceType) - { - return CachedServices.GetOrAdd( - serviceType, - _ => new Lazy(() => ServiceProvider.GetRequiredService(serviceType)) - ).Value; - } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs index 610bb40dfa..bfe08026ca 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs @@ -2,21 +2,65 @@ namespace Volo.Abp.DependencyInjection; -public interface IAbpLazyServiceProvider +public interface IAbpLazyServiceProvider : IServiceProvider { + T GetService(T defaultValue); + + object GetService(Type serviceType, object defaultValue); + + T GetService(Func factory); + + object GetService(Type serviceType, Func factory); + + #region Old Methods + + /// + /// This method is equivalent of the GetRequiredService method. + /// It does exists for backward compatibility. + /// T LazyGetRequiredService(); + /// + /// This method is equivalent of the GetRequiredService method. + /// It does exists for backward compatibility. + /// object LazyGetRequiredService(Type serviceType); + /// + /// This method is equivalent of the GetService method. + /// It does exists for backward compatibility. + /// T LazyGetService(); + /// + /// This method is equivalent of the GetService method. + /// It does exists for backward compatibility. + /// object LazyGetService(Type serviceType); + /// + /// This method is equivalent of the method. + /// It does exists for backward compatibility. + /// T LazyGetService(T defaultValue); - + + /// + /// This method is equivalent of the method. + /// It does exists for backward compatibility. + /// object LazyGetService(Type serviceType, object defaultValue); + /// + /// This method is equivalent of the method. + /// It does exists for backward compatibility. + /// object LazyGetService(Type serviceType, Func factory); + /// + /// This method is equivalent of the method. + /// It does exists for backward compatibility. + /// T LazyGetService(Func factory); + + #endregion } From 0a061ad4e3b2d5813a44213fb3dfd499ac78e2a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 10:53:08 +0300 Subject: [PATCH 52/86] Equalize IAbpLazyServiceProvider and ITransientCachedServiceProvider To reduce cached service provider service count. --- .../AbpLazyServiceProvider.cs | 29 ++++--------------- .../CachedServiceProviderBase.cs | 26 +++++++++++++++-- .../IAbpLazyServiceProvider.cs | 26 ++++++----------- .../ICachedServiceProvider.cs | 6 ++-- .../ICachedServiceProviderBase.cs | 14 +++++++++ .../ITransientCachedServiceProvider.cs | 4 +-- 6 files changed, 55 insertions(+), 50 deletions(-) create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProviderBase.cs diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs index 8af18416ff..60d4afd40c 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs @@ -3,6 +3,10 @@ using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.DependencyInjection; +/// +/// This class is equivalent of the . +/// Use instead of this class, for new projects. +/// [ExposeServices(typeof(IAbpLazyServiceProvider))] public class AbpLazyServiceProvider : CachedServiceProviderBase, @@ -13,29 +17,8 @@ public class AbpLazyServiceProvider : : base(serviceProvider) { } - - public T GetService(T defaultValue) - { - return (T)GetService(typeof(T), defaultValue); - } - - public object GetService(Type serviceType, object defaultValue) - { - return GetService(serviceType) ?? defaultValue; - } - - public T GetService(Func factory) - { - return (T)GetService(typeof(T), factory); - } - public object GetService(Type serviceType, Func factory) - { - return CachedServices.GetOrAdd( - serviceType, - _ => new Lazy(() => factory(ServiceProvider)) - ).Value; - } + #region Old Methods public virtual T LazyGetRequiredService() { @@ -57,8 +40,6 @@ public class AbpLazyServiceProvider : return GetService(serviceType); } - #region Old Methods - public virtual T LazyGetService(T defaultValue) { return GetService(defaultValue); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs index 49da116fea..21f2b1c516 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs @@ -1,10 +1,9 @@ using System; using System.Collections.Concurrent; -using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.DependencyInjection; -public abstract class CachedServiceProviderBase : IServiceProvider +public abstract class CachedServiceProviderBase : ICachedServiceProviderBase { protected IServiceProvider ServiceProvider { get; } protected ConcurrentDictionary> CachedServices { get; } @@ -23,4 +22,27 @@ public abstract class CachedServiceProviderBase : IServiceProvider _ => new Lazy(() => ServiceProvider.GetService(serviceType)) ).Value; } + + public T GetService(T defaultValue) + { + return (T)GetService(typeof(T), defaultValue); + } + + public object GetService(Type serviceType, object defaultValue) + { + return GetService(serviceType) ?? defaultValue; + } + + public T GetService(Func factory) + { + return (T)GetService(typeof(T), factory); + } + + public object GetService(Type serviceType, Func factory) + { + return CachedServices.GetOrAdd( + serviceType, + _ => new Lazy(() => factory(ServiceProvider)) + ).Value; + } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs index bfe08026ca..cd5f1da67f 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs @@ -2,18 +2,12 @@ namespace Volo.Abp.DependencyInjection; -public interface IAbpLazyServiceProvider : IServiceProvider +/// +/// This service is equivalent of the . +/// Use instead of this interface, for new projects. +/// +public interface IAbpLazyServiceProvider : ICachedServiceProviderBase { - T GetService(T defaultValue); - - object GetService(Type serviceType, object defaultValue); - - T GetService(Func factory); - - object GetService(Type serviceType, Func factory); - - #region Old Methods - /// /// This method is equivalent of the GetRequiredService method. /// It does exists for backward compatibility. @@ -39,28 +33,26 @@ public interface IAbpLazyServiceProvider : IServiceProvider object LazyGetService(Type serviceType); /// - /// This method is equivalent of the method. + /// This method is equivalent of the method. /// It does exists for backward compatibility. /// T LazyGetService(T defaultValue); /// - /// This method is equivalent of the method. + /// This method is equivalent of the method. /// It does exists for backward compatibility. /// object LazyGetService(Type serviceType, object defaultValue); /// - /// This method is equivalent of the method. + /// This method is equivalent of the method. /// It does exists for backward compatibility. /// object LazyGetService(Type serviceType, Func factory); /// - /// This method is equivalent of the method. + /// This method is equivalent of the method. /// It does exists for backward compatibility. /// T LazyGetService(Func factory); - - #endregion } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProvider.cs index 073daa135a..4a923901f9 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProvider.cs @@ -1,6 +1,4 @@ -using System; - -namespace Volo.Abp.DependencyInjection; +namespace Volo.Abp.DependencyInjection; /// /// Provides services by caching the resolved services. @@ -8,7 +6,7 @@ namespace Volo.Abp.DependencyInjection; /// This service's lifetime is scoped and it should be used /// for a limited scope. /// -public interface ICachedServiceProvider : IServiceProvider +public interface ICachedServiceProvider : ICachedServiceProviderBase { } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProviderBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProviderBase.cs new file mode 100644 index 0000000000..2e15a45a46 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProviderBase.cs @@ -0,0 +1,14 @@ +using System; + +namespace Volo.Abp.DependencyInjection; + +public interface ICachedServiceProviderBase : IServiceProvider +{ + T GetService(T defaultValue); + + object GetService(Type serviceType, object defaultValue); + + T GetService(Func factory); + + object GetService(Type serviceType, Func factory); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ITransientCachedServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ITransientCachedServiceProvider.cs index 55c43e7c94..7b57b54e07 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ITransientCachedServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ITransientCachedServiceProvider.cs @@ -1,5 +1,3 @@ -using System; - namespace Volo.Abp.DependencyInjection; /// @@ -8,7 +6,7 @@ namespace Volo.Abp.DependencyInjection; /// This service's lifetime is transient. /// for the one with scoped lifetime. /// -public interface ITransientCachedServiceProvider : IServiceProvider +public interface ITransientCachedServiceProvider : ICachedServiceProviderBase { } \ No newline at end of file From 184e50e6e6f109477b8c7e51699da014aaab5f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 11:13:23 +0300 Subject: [PATCH 53/86] Added "Cached Service Providers" section to the document --- docs/en/Dependency-Injection.md | 33 +++++++++++++++++++ .../CachedServiceProvider.cs | 1 - 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index 147ef1689a..c59b371018 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -403,6 +403,39 @@ using (var scope = _serviceProvider.CreateScope()) Both services are released when the created scope is disposed (at the end of the `using` block). +### Cached Service Providers + +ABP provides two special services to optimize resolving services from `IServiceProvider`. `ICachedServiceProvider` and `ITransientCachedServiceProvider` both inherits from the `IServiceProvider` interface and internally caches the resolved services, so you get the same service instance even if you resolve a service multiple times. + +The main difference is the `ICachedServiceProvider` is itself registered as scoped, while the `ITransientCachedServiceProvider` is registered as transient to the dependency injection system. + +The following example injects the `ICachedServiceProvider` service and resolves a service in the `DoSomethingAsync` method: + +````csharp +public class MyService : ITransientDependency +{ + private readonly ICachedServiceProvider _serviceProvider; + + public MyService(ICachedServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public async Task DoSomethingAsync() + { + var taxCalculator = _serviceProvider.GetRequiredService(); + // TODO: Use the taxCalculator + } +} + +```` + +With such a usage, you don't need to deal with creating service scopes and disposing the resolved services (as explained in the *Releasing/Disposing Services* section above). Because all the services resolved from the `ICachedServiceProvider` will be released once the service scope of the `MyService` instance is disposed. Also, you don't need to care about memory leaks (because of creating too many `ITaxCalculator` instances if we call `DoSomethingAsync` too many times), because only one `ITaxCalculator` instance is created, and it is reused. + +Use `ICachedServiceProvider` (instead of `ITransientCachedServiceProvider`) unless you need to create the service cache per usage. `ITransientCachedServiceProvider` guarantees that the created service instances are not shared with any other service, even they are in the same service scope. The services resolved from `ICachedServiceProvider` are shared with other services in the same service scope (in the same HTTP Request, for example), so it can be thought as more optimized. + +> ABP Framework also provides the `IAbpLazyServiceProvider` service. It does exists for backward compatibility and works exactly same with the `ITransientCachedServiceProvider` service. So, use the `ITransientCachedServiceProvider` since the `IAbpLazyServiceProvider` might be removed in future ABP versions. + ## Advanced Features ### IServiceCollection.OnRegistred Event diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProvider.cs index 870e1f8faf..ef0fed3541 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProvider.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace Volo.Abp.DependencyInjection; From 84750d9d74bb85020a47f8a084c211705d359e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 11:15:48 +0300 Subject: [PATCH 54/86] Update AbpLazyServiceProvider.cs --- .../Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs index 60d4afd40c..a180592a01 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs @@ -18,8 +18,6 @@ public class AbpLazyServiceProvider : { } - #region Old Methods - public virtual T LazyGetRequiredService() { return (T)LazyGetRequiredService(typeof(T)); @@ -59,6 +57,4 @@ public class AbpLazyServiceProvider : { return GetService(serviceType, factory); } - - #endregion } From 790c0bb763b7d621b6aebb794a978e83928f9a57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 11:22:10 +0300 Subject: [PATCH 55/86] Update Dependency-Injection.md --- docs/en/Dependency-Injection.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/Dependency-Injection.md b/docs/en/Dependency-Injection.md index c59b371018..47e60700bc 100644 --- a/docs/en/Dependency-Injection.md +++ b/docs/en/Dependency-Injection.md @@ -432,6 +432,8 @@ public class MyService : ITransientDependency With such a usage, you don't need to deal with creating service scopes and disposing the resolved services (as explained in the *Releasing/Disposing Services* section above). Because all the services resolved from the `ICachedServiceProvider` will be released once the service scope of the `MyService` instance is disposed. Also, you don't need to care about memory leaks (because of creating too many `ITaxCalculator` instances if we call `DoSomethingAsync` too many times), because only one `ITaxCalculator` instance is created, and it is reused. +Since `ICachedServiceProvider` and `ITransientCachedServiceProvider` extends the standard `IServiceProvider` interface, you can use all the extension method of the `IServiceProvider` interface on them. In addition, they provides some other methods to provide a default value or a factory method for the services that are not found (that means not registered to the dependency injection system). Notice that the default value (or the value returned from your factory method) is also cached and reused. + Use `ICachedServiceProvider` (instead of `ITransientCachedServiceProvider`) unless you need to create the service cache per usage. `ITransientCachedServiceProvider` guarantees that the created service instances are not shared with any other service, even they are in the same service scope. The services resolved from `ICachedServiceProvider` are shared with other services in the same service scope (in the same HTTP Request, for example), so it can be thought as more optimized. > ABP Framework also provides the `IAbpLazyServiceProvider` service. It does exists for backward compatibility and works exactly same with the `ITransientCachedServiceProvider` service. So, use the `ITransientCachedServiceProvider` since the `IAbpLazyServiceProvider` might be removed in future ABP versions. From d97adc9f94b5b2d2f1cb2cea13c2a118e130f4bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 15:31:25 +0300 Subject: [PATCH 56/86] Fix namespace of AbpEventBusBoxesOptions --- .../DistributedEvents/OracleDbContextEventInbox.cs | 1 + .../DistributedEvents/SqlRawDbContextEventInbox.cs | 1 + .../Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs index 04cf28ea88..6d70b95512 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using Volo.Abp.EventBus.Boxes; +using Volo.Abp.EventBus.Distributed; using Volo.Abp.Timing; using Volo.Abp.Uow; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/SqlRawDbContextEventInbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/SqlRawDbContextEventInbox.cs index 77c7177df6..159181b125 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/SqlRawDbContextEventInbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/SqlRawDbContextEventInbox.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using Volo.Abp.EventBus.Boxes; +using Volo.Abp.EventBus.Distributed; using Volo.Abp.Timing; using Volo.Abp.Uow; diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs index d92c48db3a..6189c126a4 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs @@ -1,6 +1,7 @@ using System; +using Volo.Abp.EventBus.Boxes; -namespace Volo.Abp.EventBus.Boxes; +namespace Volo.Abp.EventBus.Distributed; public class AbpEventBusBoxesOptions { From 4a680cd548e230f110489951adfc56a7ad78f595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 15:44:20 +0300 Subject: [PATCH 57/86] Move inbox/outbox classes to the right namespace --- .../DistributedEvents/OracleDbContextEventInbox.cs | 1 - .../DistributedEvents/OracleDbContextEventInbox.cs | 1 - .../DistributedEvents/PostgreSqlDbContextEventInbox.cs | 1 - .../DistributedEvents/DbContextEventInbox.cs | 1 - .../DistributedEvents/SqlRawDbContextEventInbox.cs | 1 - .../Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs | 1 - .../EventBus/Distributed/AbpDistributedEventBusExtensions.cs | 4 +--- .../Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs | 1 - .../Volo/Abp/EventBus/Distributed/IInboxProcessor.cs | 3 +-- .../Volo/Abp/EventBus/Distributed/IOutboxSender.cs | 3 +-- .../Volo/Abp/EventBus/Distributed/InboxProcessManager.cs | 3 +-- .../Volo/Abp/EventBus/Distributed/InboxProcessor.cs | 5 ++--- .../Volo/Abp/EventBus/Distributed/OutboxSender.cs | 4 +--- .../Volo/Abp/EventBus/Distributed/OutboxSenderManager.cs | 3 +-- .../MongoDB/DistributedEvents/MongoDbContextEventInbox.cs | 1 - 15 files changed, 8 insertions(+), 25 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs index 6d70b95512..93d740dc21 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -using Volo.Abp.EventBus.Boxes; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Timing; using Volo.Abp.Uow; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs index 6d70b95512..93d740dc21 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Oracle/Volo/Abp/EntityFrameworkCore/DistributedEvents/OracleDbContextEventInbox.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -using Volo.Abp.EventBus.Boxes; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Timing; using Volo.Abp.Uow; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/DistributedEvents/PostgreSqlDbContextEventInbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/DistributedEvents/PostgreSqlDbContextEventInbox.cs index c99192fc48..054ed78ee7 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/DistributedEvents/PostgreSqlDbContextEventInbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo/Abp/EntityFrameworkCore/DistributedEvents/PostgreSqlDbContextEventInbox.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -using Volo.Abp.EventBus.Boxes; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Timing; using Volo.Abp.Uow; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventInbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventInbox.cs index b076a17d36..1035716491 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventInbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventInbox.cs @@ -5,7 +5,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -using Volo.Abp.EventBus.Boxes; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Timing; using Volo.Abp.Uow; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/SqlRawDbContextEventInbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/SqlRawDbContextEventInbox.cs index 159181b125..0aa99e7df7 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/SqlRawDbContextEventInbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/SqlRawDbContextEventInbox.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -using Volo.Abp.EventBus.Boxes; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Timing; using Volo.Abp.Uow; diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs index 30e2a9e5b0..fe3d9f3032 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/AbpEventBusModule.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using Volo.Abp.BackgroundWorkers; using Volo.Abp.DistributedLocking; using Volo.Abp.EventBus.Abstractions; -using Volo.Abp.EventBus.Boxes; using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Local; using Volo.Abp.Guids; diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpDistributedEventBusExtensions.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpDistributedEventBusExtensions.cs index d6439fb695..273f87ed16 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpDistributedEventBusExtensions.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpDistributedEventBusExtensions.cs @@ -1,6 +1,4 @@ -using Volo.Abp.EventBus.Distributed; - -namespace Volo.Abp.EventBus.Boxes; +namespace Volo.Abp.EventBus.Distributed; public static class AbpDistributedEventBusExtensions { diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs index 6189c126a4..67facf5d42 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/AbpEventBusBoxesOptions.cs @@ -1,5 +1,4 @@ using System; -using Volo.Abp.EventBus.Boxes; namespace Volo.Abp.EventBus.Distributed; diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IInboxProcessor.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IInboxProcessor.cs index 82cef787f4..0591379a21 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IInboxProcessor.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IInboxProcessor.cs @@ -1,8 +1,7 @@ using System.Threading; using System.Threading.Tasks; -using Volo.Abp.EventBus.Distributed; -namespace Volo.Abp.EventBus.Boxes; +namespace Volo.Abp.EventBus.Distributed; public interface IInboxProcessor { diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IOutboxSender.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IOutboxSender.cs index 0a50c6b570..1fa2f51a3f 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IOutboxSender.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/IOutboxSender.cs @@ -1,8 +1,7 @@ using System.Threading; using System.Threading.Tasks; -using Volo.Abp.EventBus.Distributed; -namespace Volo.Abp.EventBus.Boxes; +namespace Volo.Abp.EventBus.Distributed; public interface IOutboxSender { diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessManager.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessManager.cs index 074585e08d..597fca0340 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessManager.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessManager.cs @@ -5,9 +5,8 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; -using Volo.Abp.EventBus.Distributed; -namespace Volo.Abp.EventBus.Boxes; +namespace Volo.Abp.EventBus.Distributed; public class InboxProcessManager : IBackgroundWorker { diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs index 50c1a4e009..1b4f0e4deb 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/InboxProcessor.cs @@ -7,12 +7,11 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.DistributedLocking; -using Volo.Abp.EventBus.Distributed; using Volo.Abp.Threading; using Volo.Abp.Timing; using Volo.Abp.Uow; -namespace Volo.Abp.EventBus.Boxes; +namespace Volo.Abp.EventBus.Distributed; public class InboxProcessor : IInboxProcessor, ITransientDependency { @@ -110,7 +109,7 @@ public class InboxProcessor : IInboxProcessor, ITransientDependency await Inbox.MarkAsProcessedAsync(waitingEvent.Id); - await uow.CompleteAsync(); + await uow.CompleteAsync(StoppingToken); } Logger.LogInformation($"Processed the incoming event with id = {waitingEvent.Id:N}"); diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs index 851ddf3da1..3f7e2dfd73 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSender.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -10,10 +9,9 @@ using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.DistributedLocking; -using Volo.Abp.EventBus.Distributed; using Volo.Abp.Threading; -namespace Volo.Abp.EventBus.Boxes; +namespace Volo.Abp.EventBus.Distributed; public class OutboxSender : IOutboxSender, ITransientDependency { diff --git a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSenderManager.cs b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSenderManager.cs index 8877c283a7..f9977b86e5 100644 --- a/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSenderManager.cs +++ b/framework/src/Volo.Abp.EventBus/Volo/Abp/EventBus/Distributed/OutboxSenderManager.cs @@ -5,9 +5,8 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; -using Volo.Abp.EventBus.Distributed; -namespace Volo.Abp.EventBus.Boxes; +namespace Volo.Abp.EventBus.Distributed; public class OutboxSenderManager : IBackgroundWorker { diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventInbox.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventInbox.cs index 2a73bd4291..55b40fa29b 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventInbox.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventInbox.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using Microsoft.Extensions.Options; using MongoDB.Driver; using MongoDB.Driver.Linq; -using Volo.Abp.EventBus.Boxes; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Timing; using Volo.Abp.Uow; From 40f5aadadac15d5dc246fc68e087797a92da8e7b Mon Sep 17 00:00:00 2001 From: malik masis Date: Wed, 30 Nov 2022 15:50:55 +0300 Subject: [PATCH 58/86] Fixed the checking null condition --- .../EfCoreIdentityUserRepository.cs | 16 ++++++++-------- .../MongoDB/MongoIdentityUserRepository.cs | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index c543201bf2..124f631311 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -172,10 +172,10 @@ public class EfCoreIdentityUserRepository : EfCoreRepository x.Email == emailAddress) .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name == name) .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) - .WhereIf(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) - .WhereIf(notActive == true, x => !x.IsActive) - .WhereIf(emailConfirmed == true, x => x.EmailConfirmed) - .WhereIf(isExternal == true, x => x.IsExternal) + .WhereIf(isLockedOut.HasValue, x => x.LockoutEnabled && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) + .WhereIf(notActive.HasValue, x => !x.IsActive) + .WhereIf(emailConfirmed.HasValue, x => x.EmailConfirmed) + .WhereIf(isExternal.HasValue, x => x.IsExternal) .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) @@ -252,10 +252,10 @@ public class EfCoreIdentityUserRepository : EfCoreRepository x.Email == emailAddress) .WhereIf(!string.IsNullOrWhiteSpace(name), x => x.Name == name) .WhereIf(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) - .WhereIf(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) - .WhereIf(notActive == true, x => !x.IsActive) - .WhereIf(emailConfirmed == true, x => x.EmailConfirmed) - .WhereIf(isExternal == true, x => x.IsExternal) + .WhereIf(isLockedOut.HasValue, x => x.LockoutEnabled && x.LockoutEnd.Value.CompareTo(DateTime.UtcNow) > 0) + .WhereIf(notActive.HasValue, x => !x.IsActive) + .WhereIf(emailConfirmed.HasValue, x => x.EmailConfirmed) + .WhereIf(isExternal.HasValue, x => x.IsExternal) .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index 000b6e68d7..710363d4a6 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -172,10 +172,10 @@ public class MongoIdentityUserRepository : MongoDbRepository>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name == name) .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) - .WhereIf>(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd > DateTimeOffset.UtcNow) - .WhereIf>(notActive == true, x => !x.IsActive) - .WhereIf>(emailConfirmed == true, x => x.EmailConfirmed) - .WhereIf>(isExternal == true, x => x.IsExternal) + .WhereIf>(isLockedOut.HasValue, x => x.LockoutEnabled && x.LockoutEnd > DateTimeOffset.UtcNow) + .WhereIf>(notActive.HasValue, x => !x.IsActive) + .WhereIf>(emailConfirmed.HasValue, x => x.EmailConfirmed) + .WhereIf>(isExternal.HasValue, x => x.IsExternal) .WhereIf(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf(minCreationTime != null, p => p.CreationTime >= minCreationTime) .WhereIf(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) @@ -256,10 +256,10 @@ public class MongoIdentityUserRepository : MongoDbRepository>(!string.IsNullOrWhiteSpace(emailAddress), x => x.Email == emailAddress) .WhereIf>(!string.IsNullOrWhiteSpace(name), x => x.Name == name) .WhereIf>(!string.IsNullOrWhiteSpace(surname), x => x.Surname == surname) - .WhereIf>(isLockedOut == true, x => x.LockoutEnabled && x.LockoutEnd > DateTimeOffset.UtcNow) - .WhereIf>(notActive == true, x => !x.IsActive) - .WhereIf>(emailConfirmed == true, x => x.EmailConfirmed) - .WhereIf>(isExternal == true, x => x.IsExternal) + .WhereIf>(isLockedOut.HasValue, x => x.LockoutEnabled && x.LockoutEnd > DateTimeOffset.UtcNow) + .WhereIf>(notActive.HasValue, x => !x.IsActive) + .WhereIf>(emailConfirmed.HasValue, x => x.EmailConfirmed) + .WhereIf>(isExternal.HasValue, x => x.IsExternal) .WhereIf>(maxCreationTime != null, p => p.CreationTime <= maxCreationTime) .WhereIf>(minCreationTime != null, p => p.CreationTime >= minCreationTime) .WhereIf>(maxModifitionTime != null, p => p.LastModificationTime <= maxModifitionTime) From 3a7ab4b89d849fe538029926de3b81d65acf4cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 15:56:01 +0300 Subject: [PATCH 59/86] Documented AbpEventBusBoxesOptions --- docs/en/Distributed-Event-Bus.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/en/Distributed-Event-Bus.md b/docs/en/Distributed-Event-Bus.md index 21b1b07256..cc63e98fcd 100644 --- a/docs/en/Distributed-Event-Bus.md +++ b/docs/en/Distributed-Event-Bus.md @@ -434,6 +434,29 @@ Here, the following properties are available on the `config` object: * `HandlerSelector`: A predicate to filter the event handled types (classes implementing the `IDistributedEventHandler` interface) to be used for this configuration. This is especially useful if you want to ignore some event handler types from inbox processing, or want to define named inbox configurations and group event handlers within these configurations. See the *Named Configurations* section. * `ImplementationType`: Type of the class that implements the database operations for the inbox. This is normally set when you call `UseDbContext` as shown before. See *Implementing a Custom Outbox/Inbox Database Provider* section for advanced usages. +#### AbpEventBusBoxesOptions + +`AbpEventBusBoxesOptions` can be used to fine-tune how inbox and outbox systems work. For most of the systems, using the defaults would be more than enough, but you can configure it to optimize your system when it is needed. + +Just like all the [options classes](Options.md), `AbpEventBusBoxesOptions` can be configured in the `ConfigureServices` method of your [module class](Module-Development-Basics.md) as shown in the following code block: + +````csharp +Configure(options => +{ + // TODO: configure the options +}); +```` + +`AbpEventBusBoxesOptions` has the following properties to be configured: + +* `BatchPublishOutboxEvents`: Can be used to enable or disable batch publishing events to the message broker. Batch publishing works if it is supported by the distributed event bus provider. If not supported, events are sent one by one as the fallback logic. Keep it as enabled since it has a great performance gain wherever possible. Default value is `true` (enabled). +* `PeriodTimeSpan`: The period of the inbox and outbox message processors to check if there is a new event in the database. Default value is 2 seconds (`TimeSpan.FromSeconds(2)`). +* `CleanOldEventTimeIntervalSpan`: The event inbox system periodically checks and deletes the old processed events from the inbox in the database. You can set this value to determine the check period. Default value is 6 hours (`TimeSpan.FromHours(6)`). +* `WaitTimeToDeleteProcessedInboxEvents`: Inbox events are not deleted from the database for a while even if they are successfully processed. This is for a system to prevent multiple process of the same event (if the event broker sends it twice). This configuration value determines the time to keep the processed events. Default value is 2 hours (`TimeSpan.FromHours(2)`). +* `InboxWaitingEventMaxCount`: The maximum number of events to query at once from the inbox in the database. Default value is 1000. +* `OutboxWaitingEventMaxCount`: The maximum number of events to query at once from the outbox in the database. Default value is 1000. +* `DistributedLockWaitDuration`: ABP uses [distributed locking](Distributed-Locking.md) to prevent concurrent access to the inbox and outbox messages in the database, when running multiple instance of the same application. If an instance of the application can not obtain the lock, it tries after a duration. This is the configuration of that duration. Default value is 15 seconds (`TimeSpan.FromSeconds(15)`). + ### Skipping Outbox `IDistributedEventBus.PublishAsync` method provides an optional parameter, `useOutbox`, which is set to `true` by default. If you bypass outbox and immediately publish an event, you can set it to `false` for a specific event publishing operation. From b42ccdee63fc568314b65befddc3135fe77f681b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 16:42:38 +0300 Subject: [PATCH 60/86] Initial Configuring Production document --- docs/en/Deployment/Configuring-Production.md | 23 ++++++++++++++++++++ docs/en/Deployment/Index.md | 1 + docs/en/docs-nav.json | 4 ++++ 3 files changed, 28 insertions(+) create mode 100644 docs/en/Deployment/Configuring-Production.md diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md new file mode 100644 index 0000000000..b9b9253ca7 --- /dev/null +++ b/docs/en/Deployment/Configuring-Production.md @@ -0,0 +1,23 @@ +# Configuring for Production + +ABP Framework has a lot of options to configure and fine-tune its features. They are all explained their own documents. Default values for these options are pretty well for most of the deployment environments. However, you may need to care about some options based on how you've structured your deployment environment. In this document, we will highlight these kind of options. So, it is highly recommended to read this document to not have unexpected behaviors in your system in production. + +## Distributed Cache Prefix + +ABP's [distributed cache infrastructure](../Caching.md) provides an option to set a key prefix for all of your data saved into your distributed cache provider. The default value of this option is not set (it is `null`). If you are using a distributed cache server that is concurrently used by different applications, then you can set a prefix value to isolate an application's cache data from others. + +````csharp +Configure(options => +{ + options.KeyPrefix = "MyCrmApp"; +}); +```` + +That's all. ABP, then will add this prefix to all of your cache keys in your application as along as you use ABP's `IDistributedCache` or `IDistributedCache` services. See the [caching documentation](../Caching.md) if you are new to the distributed caching. + +> **Warning #1**: If you use ASP.NET Core's standard `IDistributedCache` service, it's your responsibility to add the key prefix (you can get the value by injecting `IOptions`). ABP can not do it. + +> **Warning #2**: Even if you never used distributed caching in your own codebase, ABP still uses it for some systems. So, you should always configure this prefix if your server is shared among multiple systems. + +> **Warning #3**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured. + diff --git a/docs/en/Deployment/Index.md b/docs/en/Deployment/Index.md index 6503f8b664..852efa3d43 100644 --- a/docs/en/Deployment/Index.md +++ b/docs/en/Deployment/Index.md @@ -6,4 +6,5 @@ However, there are some topics that you should care about when you are deploying ## Guides +* [Configuring for production](Configuring-Production.md): Notes for some important configurations for production environments. * [Deploying to a clustered environment](Clustered-Environment.md): Explains how to configure your application when you want to run multiple instances of your application concurrently. diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index ef6b0cad07..d7cf2a5389 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -1299,6 +1299,10 @@ "text": "Deployment", "path": "Deployment/Index.md", "items": [ + { + "text": "Configuring for Production", + "path": "Deployment/Configuring-Production.md" + }, { "text": "Deploying to a Clustered Environment", "path": "Deployment/Clustered-Environment.md" From c5fac16161337abc27e221f8000fe4f5e2466cb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 16:49:40 +0300 Subject: [PATCH 61/86] Added section: Distributed Lock Prefix --- docs/en/Deployment/Configuring-Production.md | 23 +++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index b9b9253ca7..160885c5d0 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -4,7 +4,7 @@ ABP Framework has a lot of options to configure and fine-tune its features. They ## Distributed Cache Prefix -ABP's [distributed cache infrastructure](../Caching.md) provides an option to set a key prefix for all of your data saved into your distributed cache provider. The default value of this option is not set (it is `null`). If you are using a distributed cache server that is concurrently used by different applications, then you can set a prefix value to isolate an application's cache data from others. +ABP's [distributed cache infrastructure](../Caching.md) provides an option to set a key prefix for all of your data saved into your distributed cache provider. The default value of this option is not set (it is `null`). If you are using a distributed cache server that shared by different applications, then you can set a prefix value to isolate an application's cache data from others. ````csharp Configure(options => @@ -13,11 +13,28 @@ Configure(options => }); ```` -That's all. ABP, then will add this prefix to all of your cache keys in your application as along as you use ABP's `IDistributedCache` or `IDistributedCache` services. See the [caching documentation](../Caching.md) if you are new to the distributed caching. +That's all. ABP, then will add this prefix to all of your cache keys in your application as along as you use ABP's `IDistributedCache` or `IDistributedCache` services. See the [Caching documentation](../Caching.md) if you are new to the distributed caching. > **Warning #1**: If you use ASP.NET Core's standard `IDistributedCache` service, it's your responsibility to add the key prefix (you can get the value by injecting `IOptions`). ABP can not do it. -> **Warning #2**: Even if you never used distributed caching in your own codebase, ABP still uses it for some systems. So, you should always configure this prefix if your server is shared among multiple systems. +> **Warning #2**: Even if you have never used distributed caching in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your caching server is shared among multiple systems. > **Warning #3**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured. +## Distributed Lock Prefix + +ABP's [distributed locking infrastructure](../Distributed-Locking.md) provides an option to set a prefix for all keys you are using in the distributed lock server. The default value of this option is not set (it is `null`). If you are using a distributed lock server that is shared by different applications, then you can set a prefix value to isolate an application's locks from others. + +````csharp +Configure(options => +{ + options.KeyPrefix = "MyCrmApp"; +}); +```` + +That's all. ABP, then will add this prefix to all of your keys in your application. See the [Distributed Locking documentation](../Distributed-Locking.md) if you are new to the distributed locking. + +> **Warning #1**: Even if you have never used distributed locking in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your distributed lock server is shared among multiple systems. + +> **Warning #2**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed locking. So, please check your application code if it is already configured. + From b22d701ecc5a0dea54b2eafadf6f545ec35bc6c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 17:43:12 +0300 Subject: [PATCH 62/86] Update Configuring-Production.md --- docs/en/Deployment/Configuring-Production.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index 160885c5d0..5cf39f1d60 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -19,7 +19,9 @@ That's all. ABP, then will add this prefix to all of your cache keys in your app > **Warning #2**: Even if you have never used distributed caching in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your caching server is shared among multiple systems. -> **Warning #3**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured. +> **Warning #3**: If you are building a microservice system, then you will have multiple applications that share the same distributed cache server. In such systems, all applications (or services) normally should use the same cache prefix, because you want all the applications use the same cache data to have consistency between applications. + +> **Warning #4**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured. ## Distributed Lock Prefix @@ -36,5 +38,7 @@ That's all. ABP, then will add this prefix to all of your keys in your applicati > **Warning #1**: Even if you have never used distributed locking in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your distributed lock server is shared among multiple systems. -> **Warning #2**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed locking. So, please check your application code if it is already configured. +> **Warning #2**: If you are building a microservice system, then you will have multiple applications that share the same distributed locking server. In such systems, all applications (or services) normally should use the same lock prefix, because you want to lock your resources globally in your system. + +> **Warning #3**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed locking. So, please check your application code if it is already configured. From c20859560d79be972d22d1556da202cfe579412f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 17:52:47 +0300 Subject: [PATCH 63/86] Added section: Email Sender --- docs/en/Deployment/Configuring-Production.md | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index 5cf39f1d60..2078cc0cb4 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -42,3 +42,28 @@ That's all. ABP, then will add this prefix to all of your keys in your applicati > **Warning #3**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed locking. So, please check your application code if it is already configured. +## Email Sender + +ABP's [Email Sending](../Emailing.md) system abstracts sending emails from your application and module code and allows you to configure the email provider and settings in a single place. + +Email service is configured to write email contents to the standard [application log](../Logging.md) in development environment. You should configure the email settings to be able to send emails to users in your production environment. + +Please see the [Email Sending](../Emailing.md) document to learn how to configure its settings to really send emails. + +> **Warning**: If you don't configure the email settings, you will get errors while trying to send emails. For example, the [Account module](../Modules/Account.md)'s *Password Reset* feature sends email to the users to reset their passwords if they forget it. + +## SMS Sender + +TODO + +## BLOB Provider + +TODO + +## String Encryption + +TODO + +## Swagger + +TODO From 828756a10253c6b507215dab5b047a648c24645c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 18:02:04 +0300 Subject: [PATCH 64/86] Added section: SMS Sender --- docs/en/Deployment/Configuring-Production.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index 2078cc0cb4..197cd21d2f 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -54,7 +54,21 @@ Please see the [Email Sending](../Emailing.md) document to learn how to configur ## SMS Sender -TODO +ABP's [SMS Sending abstraction](https://docs.abp.io/en/abp/latest/SMS-Sending) provides a unified interface to send SMS to users. However, its implementation is left to you. Because, typically a paid SMS service is used to send SMS, and ABP doesn't depend on a specific SMS provider. + +So, if you are using the `ISmsSender` service, you must implement it yourself, as shown in the following code block: + +````csharp +public class MySmsSender : ISmsSender, ITransientDependency +{ + public async Task SendAsync(SmsMessage smsMessage) + { + // TODO: Send it using your provider... + } +} +```` + +> [ABP Commercial](https://commercial.abp.io/) provide a [Twilio SMS Module](https://docs.abp.io/en/commercial/latest/modules/twilio-sms) as a pre-built integration with the popular [Twilio](https://www.twilio.com/) platform. ## BLOB Provider From 882d5b7e62d6e0d1ca89783b2611e7854463ab21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 18:18:55 +0300 Subject: [PATCH 65/86] Added BLOB Provider section --- docs/en/Deployment/Configuring-Production.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index 197cd21d2f..fce19ba273 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -72,7 +72,11 @@ public class MySmsSender : ISmsSender, ITransientDependency ## BLOB Provider -TODO +If you use ABP's [BLOB Storing](https://docs.abp.io/en/abp/latest/Blob-Storing) infrastructure, you should care about the BLOB provider in your production environment. For example, if you use the [File System](../Blob-Storing-File-System.md) provider and running your application in a Docker container, you should configure a volume map for the BLOB storage path. Otherwise, your data is lost when the container has been restarted. Also, File System is not a good provider for production if you have a [clustered deployment](Clustered-Environment.md) or a microservice system. + +Check the [BLOB Storing](../Blob-Storing.md) document to see all the available BLOG storage providers. + +> **Warning**: Even if you don't directly use the BLOB Storage system, a module you are depending may use it. For example, ABP Commercial's [File Management](https://docs.abp.io/en/commercial/latest/modules/file-management) module stores file contents, and the [Account](https://docs.abp.io/en/commercial/latest/modules/account) module stores user profile pictures in the BLOB Storage system. So, be careful on the BLOB Storing configuration in production. Note that ABP Commercial uses the [Database Provider](../Blob-Storing-Database.md) as pre-configured BLOB storage provider, which works in production without any problem, but you may still want to use another provider. ## String Encryption From c29995772c7275ac55558ca1c2e2db97d1ac25df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 20:42:39 +0300 Subject: [PATCH 66/86] Added sections --- docs/en/Deployment/Configuring-Production.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index fce19ba273..6b038d444b 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -72,15 +72,24 @@ public class MySmsSender : ISmsSender, ITransientDependency ## BLOB Provider -If you use ABP's [BLOB Storing](https://docs.abp.io/en/abp/latest/Blob-Storing) infrastructure, you should care about the BLOB provider in your production environment. For example, if you use the [File System](../Blob-Storing-File-System.md) provider and running your application in a Docker container, you should configure a volume map for the BLOB storage path. Otherwise, your data is lost when the container has been restarted. Also, File System is not a good provider for production if you have a [clustered deployment](Clustered-Environment.md) or a microservice system. +If you use ABP's [BLOB Storing](https://docs.abp.io/en/abp/latest/Blob-Storing) infrastructure, you should care about the BLOB provider in your production environment. For example, if you use the [File System](../Blob-Storing-File-System.md) provider and running your application in a Docker container, you should configure a volume mapping for the BLOB storage path. Otherwise, your data is lost when the container has been restarted. Also, File System is not a good provider for production if you have a [clustered deployment](Clustered-Environment.md) or a microservice system. -Check the [BLOB Storing](../Blob-Storing.md) document to see all the available BLOG storage providers. +Check the [BLOB Storing](../Blob-Storing.md) document to see all the available BLOB storage providers. > **Warning**: Even if you don't directly use the BLOB Storage system, a module you are depending may use it. For example, ABP Commercial's [File Management](https://docs.abp.io/en/commercial/latest/modules/file-management) module stores file contents, and the [Account](https://docs.abp.io/en/commercial/latest/modules/account) module stores user profile pictures in the BLOB Storage system. So, be careful on the BLOB Storing configuration in production. Note that ABP Commercial uses the [Database Provider](../Blob-Storing-Database.md) as pre-configured BLOB storage provider, which works in production without any problem, but you may still want to use another provider. ## String Encryption -TODO +ABP's [`IStringEncryptionService` Service](../String-Encryption.md) simply encrypts and decrypts given strings based on a password phrase. You should configure the `AbpStringEncryptionOptions` options for the production with a strong password and keep it as a secret. You can also configure the other properties of that options class. See the following example: + +````csharp +Configure(options => +{ + options.DefaultPassPhrase = "gs5nTT042HAL4it1"; +}); +```` + +Note that ABP CLI automatically sets the password to a random value on a new project creation. However, it is stored in the `appsettings.json` file and generally added to your source control. It is suggested to use [User Secrets](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets) or [Environment Variables](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration) to set that value. ## Swagger From d215d5faca4ef671b9da8b873d5cf2abde0a2a12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 20:53:18 +0300 Subject: [PATCH 67/86] Update Configuring-Production.md --- docs/en/Deployment/Configuring-Production.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index 6b038d444b..40fcca62fa 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -91,6 +91,10 @@ Configure(options => Note that ABP CLI automatically sets the password to a random value on a new project creation. However, it is stored in the `appsettings.json` file and generally added to your source control. It is suggested to use [User Secrets](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets) or [Environment Variables](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration) to set that value. -## Swagger +## The Swagger UI -TODO +ABP's startup solution templates come with the [Swagger UI](https://swagger.io/) pre-installed. Swagger is a pretty standard and useful tool to discover and test your HTTP APIs on a built-in UI that is embedded into your application or service. It is typically used in development environment, but you may want to enable it on staging or production environments too. + +While you will always secure your HTTP APIs with other techniques (like the [Authorization](../Authorization.md) system), allowing malicious software and people to easily discover your HTTP API endpoint details can be considered as a security problem for some systems. So, be careful while taking the decision of enabling or disabling Swagger for the production environment. + +> You may also want to see the [ABP Swagger integration](../API/Swagger-Integration.md) document. From 97ccf603c4fdd0dfc902edb245903461965aee16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 30 Nov 2022 20:58:36 +0300 Subject: [PATCH 68/86] Change warnings --- docs/en/Deployment/Configuring-Production.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index 40fcca62fa..1e562473ba 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -15,13 +15,13 @@ Configure(options => That's all. ABP, then will add this prefix to all of your cache keys in your application as along as you use ABP's `IDistributedCache` or `IDistributedCache` services. See the [Caching documentation](../Caching.md) if you are new to the distributed caching. -> **Warning #1**: If you use ASP.NET Core's standard `IDistributedCache` service, it's your responsibility to add the key prefix (you can get the value by injecting `IOptions`). ABP can not do it. +> **Warning**: If you use ASP.NET Core's standard `IDistributedCache` service, it's your responsibility to add the key prefix (you can get the value by injecting `IOptions`). ABP can not do it. -> **Warning #2**: Even if you have never used distributed caching in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your caching server is shared among multiple systems. +> **Warning**: Even if you have never used distributed caching in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your caching server is shared among multiple systems. -> **Warning #3**: If you are building a microservice system, then you will have multiple applications that share the same distributed cache server. In such systems, all applications (or services) normally should use the same cache prefix, because you want all the applications use the same cache data to have consistency between applications. +> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed cache server. In such systems, all applications (or services) normally should use the same cache prefix, because you want all the applications use the same cache data to have consistency between applications. -> **Warning #4**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured. +> **Warning**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured. ## Distributed Lock Prefix @@ -36,11 +36,11 @@ Configure(options => That's all. ABP, then will add this prefix to all of your keys in your application. See the [Distributed Locking documentation](../Distributed-Locking.md) if you are new to the distributed locking. -> **Warning #1**: Even if you have never used distributed locking in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your distributed lock server is shared among multiple systems. +> **Warning**: Even if you have never used distributed locking in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your distributed lock server is shared among multiple systems. -> **Warning #2**: If you are building a microservice system, then you will have multiple applications that share the same distributed locking server. In such systems, all applications (or services) normally should use the same lock prefix, because you want to lock your resources globally in your system. +> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed locking server. In such systems, all applications (or services) normally should use the same lock prefix, because you want to lock your resources globally in your system. -> **Warning #3**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed locking. So, please check your application code if it is already configured. +> **Warning**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed locking. So, please check your application code if it is already configured. ## Email Sender From 17f345c5a797ae12b5e501e8f69255043ff76cb8 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 1 Dec 2022 11:15:36 +0800 Subject: [PATCH 69/86] Update Hangfire document --- docs/en/Background-Workers-Hangfire.md | 21 +++++++-------------- docs/zh-Hans/Background-Workers-Hangfire.md | 21 +++++++-------------- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/docs/en/Background-Workers-Hangfire.md b/docs/en/Background-Workers-Hangfire.md index b076cf0395..4706261849 100644 --- a/docs/en/Background-Workers-Hangfire.md +++ b/docs/en/Background-Workers-Hangfire.md @@ -53,7 +53,7 @@ public class MyLogWorker : HangfireBackgroundWorkerBase CronExpression = Cron.Daily(); } - public override Task DoWorkAsync() + public override Task DoWorkAsync(CancellationToken cancellationToken = default) { Logger.LogInformation("Executed MyLogWorker..!"); return Task.CompletedTask; @@ -68,14 +68,7 @@ public class MyLogWorker : HangfireBackgroundWorkerBase ### UnitOfWork -For use with `UnitOfWorkAttribute`, you need to define an interface for worker: - ```csharp -public interface IMyLogWorker : IHangfireBackgroundWorker -{ -} - -[ExposeServices(typeof(IMyLogWorker))] public class MyLogWorker : HangfireBackgroundWorkerBase, IMyLogWorker { public MyLogWorker() @@ -85,10 +78,13 @@ public class MyLogWorker : HangfireBackgroundWorkerBase, IMyLogWorker } [UnitOfWork] - public override Task DoWorkAsync() + public override Task DoWorkAsync(CancellationToken cancellationToken = default) { - Logger.LogInformation("Executed MyLogWorker..!"); - return Task.CompletedTask; + using (var uow = LazyServiceProvider.LazyGetRequiredService().Begin()) + { + Logger.LogInformation("Executed MyLogWorker..!"); + return Task.CompletedTask; + } } } ``` @@ -105,9 +101,6 @@ public class MyModule : AbpModule ApplicationInitializationContext context) { await context.AddBackgroundWorkerAsync(); - - //If the interface is defined - //await context.AddBackgroundWorkerAsync(); } } ```` diff --git a/docs/zh-Hans/Background-Workers-Hangfire.md b/docs/zh-Hans/Background-Workers-Hangfire.md index b02a793d3f..1ff88f7620 100644 --- a/docs/zh-Hans/Background-Workers-Hangfire.md +++ b/docs/zh-Hans/Background-Workers-Hangfire.md @@ -54,7 +54,7 @@ public class MyLogWorker : HangfireBackgroundWorkerBase CronExpression = Cron.Daily(); } - public override Task DoWorkAsync() + public override Task DoWorkAsync(CancellationToken cancellationToken = default) { Logger.LogInformation("Executed MyLogWorker..!"); return Task.CompletedTask; @@ -69,14 +69,7 @@ public class MyLogWorker : HangfireBackgroundWorkerBase ### UnitOfWork -使用 `UnitOfWorkAttribute` 你需要为工作者定义一个接口: - ```csharp -public interface IMyLogWorker : IHangfireBackgroundWorker -{ -} - -[ExposeServices(typeof(IMyLogWorker))] public class MyLogWorker : HangfireBackgroundWorkerBase, IMyLogWorker { public MyLogWorker() @@ -86,10 +79,13 @@ public class MyLogWorker : HangfireBackgroundWorkerBase, IMyLogWorker } [UnitOfWork] - public override Task DoWorkAsync() + public override Task DoWorkAsync(CancellationToken cancellationToken = default) { - Logger.LogInformation("Executed MyLogWorker..!"); - return Task.CompletedTask; + using (var uow = LazyServiceProvider.LazyGetRequiredService().Begin()) + { + Logger.LogInformation("Executed MyLogWorker..!"); + return Task.CompletedTask; + } } } ``` @@ -106,9 +102,6 @@ public class MyModule : AbpModule ApplicationInitializationContext context) { await context.AddBackgroundWorkerAsync(); - - //如果定义了接口 - //await context.AddBackgroundWorkerAsync(); } } ```` From 0900b381586900ba6212379195ea2db3878066bf Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 1 Dec 2022 11:54:52 +0800 Subject: [PATCH 70/86] Update Background-Workers-Hangfire.md --- docs/en/Background-Workers-Hangfire.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/en/Background-Workers-Hangfire.md b/docs/en/Background-Workers-Hangfire.md index 4706261849..5a456b1092 100644 --- a/docs/en/Background-Workers-Hangfire.md +++ b/docs/en/Background-Workers-Hangfire.md @@ -77,7 +77,6 @@ public class MyLogWorker : HangfireBackgroundWorkerBase, IMyLogWorker CronExpression = Cron.Daily(); } - [UnitOfWork] public override Task DoWorkAsync(CancellationToken cancellationToken = default) { using (var uow = LazyServiceProvider.LazyGetRequiredService().Begin()) From c3004dfb4306413ca936c2fa1b8b7b08ebeaccd6 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 1 Dec 2022 11:55:45 +0800 Subject: [PATCH 71/86] Update Background-Workers-Hangfire.md --- docs/zh-Hans/Background-Workers-Hangfire.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/zh-Hans/Background-Workers-Hangfire.md b/docs/zh-Hans/Background-Workers-Hangfire.md index 1ff88f7620..fde7b35973 100644 --- a/docs/zh-Hans/Background-Workers-Hangfire.md +++ b/docs/zh-Hans/Background-Workers-Hangfire.md @@ -78,7 +78,6 @@ public class MyLogWorker : HangfireBackgroundWorkerBase, IMyLogWorker CronExpression = Cron.Daily(); } - [UnitOfWork] public override Task DoWorkAsync(CancellationToken cancellationToken = default) { using (var uow = LazyServiceProvider.LazyGetRequiredService().Begin()) @@ -120,4 +119,4 @@ context.ServiceProvider 它解析给定的后台工作者并添加到 `IBackgroundWorkerManager`. -虽然我们通常在 `OnApplicationInitializationAsync` 中添加后台工作者, 但对此没有限制. 你可以在任何地方注入 `IBackgroundWorkerManager` 并在运行时添加后台工作者. \ No newline at end of file +虽然我们通常在 `OnApplicationInitializationAsync` 中添加后台工作者, 但对此没有限制. 你可以在任何地方注入 `IBackgroundWorkerManager` 并在运行时添加后台工作者. From b6e28c17851d03d468fe5d0f156daac66bff30ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 1 Dec 2022 10:02:57 +0300 Subject: [PATCH 72/86] Document for: Separated localization endpoint from configuration endpoint --- docs/en/API/Application-Configuration.md | 7 ++--- docs/en/API/Application-Localization.md | 33 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 docs/en/API/Application-Localization.md diff --git a/docs/en/API/Application-Configuration.md b/docs/en/API/Application-Configuration.md index 8441459e02..5f2f2a9c6d 100644 --- a/docs/en/API/Application-Configuration.md +++ b/docs/en/API/Application-Configuration.md @@ -2,13 +2,14 @@ ABP Framework provides a pre-built and standard endpoint that contains some useful information about the application/service. Here, the list of some fundamental information at this endpoint: -* [Localization](../Localization.md) values, supported and the current language of the application. -* Available and granted [policies](../Authorization.md) (permissions) for the current user. +* Granted [policies](../Authorization.md) (permissions) for the current user. * [Setting](../Settings.md) values for the current user. * Info about the [current user](../CurrentUser.md) (like id and user name). * Info about the current [tenant](../Multi-Tenancy.md) (like id and name). * [Time zone](../Timing.md) information for the current user and the [clock](../Timing.md) type of the application. +> If you have started with ABP's startup solution templates and using one of the official UI options, then all these are set up for you and you don't need to know these details. However, if you are building a UI application from scratch, you may want to know this endpoint. + ## HTTP API If you navigate to the `/api/abp/application-configuration` URL of an ABP Framework based web application or HTTP Service, you can access the configuration as a JSON object. This endpoint is useful to create the client of your application. @@ -19,5 +20,5 @@ For ASP.NET Core MVC (Razor Pages) applications, the same configuration values a See the [JavaScript API document](../UI/AspNetCore/JavaScript-API/Index.md) for the ASP.NET Core UI. -Other UI types provide services native to the related platform. For example, see the [Angular UI localization documentation](../UI/Angular/Localization.md) to learn how to use the localization values exposes by this endpoint. +Other UI types provide services native to the related platform. For example, see the [Angular UI settings documentation](../UI/Angular/Settings.md) to learn how to use the setting values exposes by this endpoint. diff --git a/docs/en/API/Application-Localization.md b/docs/en/API/Application-Localization.md new file mode 100644 index 0000000000..adf26c8fa8 --- /dev/null +++ b/docs/en/API/Application-Localization.md @@ -0,0 +1,33 @@ +# Application Localization Endpoint + +ABP Framework provides a pre-built and standard endpoint that returns all the [localization](../Localization.md) resources and texts defined in the server. + +> If you have started with ABP's startup solution templates and using one of the official UI options, then all these are set up for you and you don't need to know these details. However, if you are building a UI application from scratch, you may want to know this endpoint. + +## HTTP API + +`/api/abp/application-localization` is the main URL of the HTTP API that returns the localization data as a JSON string. I accepts the following query string parameters: + +* `cultureName` (required): A culture code to get the localization data, like `en` or `en-US`. +* `onlyDynamics` (optional, default: `false`): Can be set to `true` to only get the dynamically defined localization resources and texts. If your client-side application shares the same localization resources with the server (like ABP's Blazor and MVC UIs), you can set `onlyDynamics` to `true`. + +**Example request:** + +```` +/api/abp/application-localization?cultureName=en +```` + +## Script + +For [ASP.NET Core MVC (Razor Pages)](../UI/AspNetCore/Overall.md) applications, the same localization data is also available on the JavaScript side. `/Abp/ApplicationLocalizationScript` is the URL of the script that is auto-generated based on the HTTP API above. + +**Example request:** + +```` +/Abp/ApplicationLocalizationScript?cultureName=en +```` + +See the [JavaScript API document](../UI/AspNetCore/JavaScript-API/Index.md) for the ASP.NET Core UI. + +Other UI types provide services native to the related platform. For example, see the [Angular UI localization documentation](../UI/Angular/Localization.md) to learn how to use the localization values exposes by this endpoint. + From 87c4aafa6c48010abfde14433afc0804a75e44b6 Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Thu, 1 Dec 2022 10:08:49 +0300 Subject: [PATCH 73/86] quick fix --- docs/en/Deployment/Configuring-Production.md | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index 1e562473ba..e4938bea44 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -1,10 +1,10 @@ # Configuring for Production -ABP Framework has a lot of options to configure and fine-tune its features. They are all explained their own documents. Default values for these options are pretty well for most of the deployment environments. However, you may need to care about some options based on how you've structured your deployment environment. In this document, we will highlight these kind of options. So, it is highly recommended to read this document to not have unexpected behaviors in your system in production. +ABP Framework has a lot of options to configure and fine-tune its features. They are all explained in their own documents. Default values for these options are pretty well for most of the deployment environments. However, you may need to care about some options based on how you've structured your deployment environment. In this document, we will highlight these kind of options. So, it is highly recommended to read this document in order to not have unexpected behaviors in your system in production. ## Distributed Cache Prefix -ABP's [distributed cache infrastructure](../Caching.md) provides an option to set a key prefix for all of your data saved into your distributed cache provider. The default value of this option is not set (it is `null`). If you are using a distributed cache server that shared by different applications, then you can set a prefix value to isolate an application's cache data from others. +ABP's [distributed cache infrastructure](../Caching.md) provides an option to set a key prefix for all of your data that is saved into your distributed cache provider. The default value of this option is not set (it is `null`). If you are using a distributed cache server that is shared by different applications, then you can set a prefix value to isolate an application's cache data from others. ````csharp Configure(options => @@ -13,19 +13,19 @@ Configure(options => }); ```` -That's all. ABP, then will add this prefix to all of your cache keys in your application as along as you use ABP's `IDistributedCache` or `IDistributedCache` services. See the [Caching documentation](../Caching.md) if you are new to the distributed caching. +That's all. ABP, then will add this prefix to all of your cache keys in your application as along as you use ABP's `IDistributedCache` or `IDistributedCache` services. See the [Caching documentation](../Caching.md) if you are new to distributed caching. > **Warning**: If you use ASP.NET Core's standard `IDistributedCache` service, it's your responsibility to add the key prefix (you can get the value by injecting `IOptions`). ABP can not do it. > **Warning**: Even if you have never used distributed caching in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your caching server is shared among multiple systems. -> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed cache server. In such systems, all applications (or services) normally should use the same cache prefix, because you want all the applications use the same cache data to have consistency between applications. +> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed cache server. In such systems, all applications (or services) should normally use the same cache prefix, because you want all the applications to use the same cache data to have consistency between them. > **Warning**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured. ## Distributed Lock Prefix -ABP's [distributed locking infrastructure](../Distributed-Locking.md) provides an option to set a prefix for all keys you are using in the distributed lock server. The default value of this option is not set (it is `null`). If you are using a distributed lock server that is shared by different applications, then you can set a prefix value to isolate an application's locks from others. +ABP's [distributed locking infrastructure](../Distributed-Locking.md) provides an option to set a prefix for all the keys you are using in the distributed lock server. The default value of this option is not set (it is `null`). If you are using a distributed lock server that is shared by different applications, then you can set a prefix value to isolate an application's lock from others. ````csharp Configure(options => @@ -34,13 +34,13 @@ Configure(options => }); ```` -That's all. ABP, then will add this prefix to all of your keys in your application. See the [Distributed Locking documentation](../Distributed-Locking.md) if you are new to the distributed locking. +That's all. ABP, then will add this prefix to all of your keys in your application. See the [Distributed Locking documentation](../Distributed-Locking.md) if you are new to distributed locking. > **Warning**: Even if you have never used distributed locking in your own codebase, ABP still uses it for some features. So, you should always configure this prefix if your distributed lock server is shared among multiple systems. -> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed locking server. In such systems, all applications (or services) normally should use the same lock prefix, because you want to lock your resources globally in your system. +> **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed locking server. In such systems, all applications (or services) should normally use the same lock prefix, because you want to globally lock your resources in your system. -> **Warning**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed locking. So, please check your application code if it is already configured. +> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for distributed locking. So, please check your application code if it is already configured. ## Email Sender @@ -68,19 +68,19 @@ public class MySmsSender : ISmsSender, ITransientDependency } ```` -> [ABP Commercial](https://commercial.abp.io/) provide a [Twilio SMS Module](https://docs.abp.io/en/commercial/latest/modules/twilio-sms) as a pre-built integration with the popular [Twilio](https://www.twilio.com/) platform. +> [ABP Commercial](https://commercial.abp.io/) provides a [Twilio SMS Module](https://docs.abp.io/en/commercial/latest/modules/twilio-sms) as a pre-built integration with the popular [Twilio](https://www.twilio.com/) platform. ## BLOB Provider -If you use ABP's [BLOB Storing](https://docs.abp.io/en/abp/latest/Blob-Storing) infrastructure, you should care about the BLOB provider in your production environment. For example, if you use the [File System](../Blob-Storing-File-System.md) provider and running your application in a Docker container, you should configure a volume mapping for the BLOB storage path. Otherwise, your data is lost when the container has been restarted. Also, File System is not a good provider for production if you have a [clustered deployment](Clustered-Environment.md) or a microservice system. +If you use ABP's [BLOB Storing](https://docs.abp.io/en/abp/latest/Blob-Storing) infrastructure, you should care about the BLOB provider in your production environment. For example, if you use the [File System](../Blob-Storing-File-System.md) provider and your application is running in a Docker container, you should configure a volume mapping for the BLOB storage path. Otherwise, your data will be lost when the container is restarted. Also, the File System is not a good provider for production if you have a [clustered deployment](Clustered-Environment.md) or a microservice system. Check the [BLOB Storing](../Blob-Storing.md) document to see all the available BLOB storage providers. -> **Warning**: Even if you don't directly use the BLOB Storage system, a module you are depending may use it. For example, ABP Commercial's [File Management](https://docs.abp.io/en/commercial/latest/modules/file-management) module stores file contents, and the [Account](https://docs.abp.io/en/commercial/latest/modules/account) module stores user profile pictures in the BLOB Storage system. So, be careful on the BLOB Storing configuration in production. Note that ABP Commercial uses the [Database Provider](../Blob-Storing-Database.md) as pre-configured BLOB storage provider, which works in production without any problem, but you may still want to use another provider. +> **Warning**: Even if you don't directly use the BLOB Storage system, a module you are depending on may use it. For example, ABP Commercial's [File Management](https://docs.abp.io/en/commercial/latest/modules/file-management) module stores file contents, and the [Account](https://docs.abp.io/en/commercial/latest/modules/account) module stores user profile pictures in the BLOB Storage system. So, be careful with the BLOB Storing configuration in production. Note that ABP Commercial uses the [Database Provider](../Blob-Storing-Database.md) as a pre-configured BLOB storage provider, which works in production without any problem, but you may still want to use another provider. ## String Encryption -ABP's [`IStringEncryptionService` Service](../String-Encryption.md) simply encrypts and decrypts given strings based on a password phrase. You should configure the `AbpStringEncryptionOptions` options for the production with a strong password and keep it as a secret. You can also configure the other properties of that options class. See the following example: +ABP's [`IStringEncryptionService` Service](../String-Encryption.md) simply encrypts and decrypts given strings based on a password phrase. You should configure the `AbpStringEncryptionOptions` options for the production with a strong password and keep it as a secret. You can also configure the other properties of those options class. See the following example: ````csharp Configure(options => @@ -89,11 +89,11 @@ Configure(options => }); ```` -Note that ABP CLI automatically sets the password to a random value on a new project creation. However, it is stored in the `appsettings.json` file and generally added to your source control. It is suggested to use [User Secrets](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets) or [Environment Variables](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration) to set that value. +Note that ABP CLI automatically sets the password to a random value on a new project creation. However, it is stored in the `appsettings.json` file and is generally added to your source control. It is suggested to use [User Secrets](https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets) or [Environment Variables](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration) to set that value. ## The Swagger UI -ABP's startup solution templates come with the [Swagger UI](https://swagger.io/) pre-installed. Swagger is a pretty standard and useful tool to discover and test your HTTP APIs on a built-in UI that is embedded into your application or service. It is typically used in development environment, but you may want to enable it on staging or production environments too. +ABP's startup solution templates come with [Swagger UI](https://swagger.io/) pre-installed. Swagger is a pretty standard and useful tool to discover and test your HTTP APIs on a built-in UI that is embedded into your application or service. It is typically used in development environment, but you may want to enable it on staging or production environments too. While you will always secure your HTTP APIs with other techniques (like the [Authorization](../Authorization.md) system), allowing malicious software and people to easily discover your HTTP API endpoint details can be considered as a security problem for some systems. So, be careful while taking the decision of enabling or disabling Swagger for the production environment. From 22ad7c39f3dfcfe06e4982e5504cb559ae9e05e2 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 1 Dec 2022 15:16:47 +0800 Subject: [PATCH 74/86] Add `GivenName` claim to `Userinfo` endpoint. --- .../Volo/Abp/OpenIddict/Controllers/UserInfoController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/UserInfoController.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/UserInfoController.cs index 74fc01c89f..418b361bda 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/UserInfoController.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/UserInfoController.cs @@ -44,6 +44,7 @@ public class UserInfoController : AbpOpenIdDictControllerBase claims[AbpClaimTypes.TenantId] = user.TenantId; claims[OpenIddictConstants.Claims.PreferredUsername] = user.UserName; claims[OpenIddictConstants.Claims.FamilyName] = user.Surname; + claims[OpenIddictConstants.Claims.GivenName] = user.Name; } if (User.HasScope(OpenIddictConstants.Scopes.Email)) From eba100097cd2b991e1abb64646ebf7b777db000e Mon Sep 17 00:00:00 2001 From: Hamza Albreem <94292623+braim23@users.noreply.github.com> Date: Thu, 1 Dec 2022 10:21:58 +0300 Subject: [PATCH 75/86] tiny fix --- docs/en/Deployment/Configuring-Production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Deployment/Configuring-Production.md b/docs/en/Deployment/Configuring-Production.md index e4938bea44..5efa560621 100644 --- a/docs/en/Deployment/Configuring-Production.md +++ b/docs/en/Deployment/Configuring-Production.md @@ -21,7 +21,7 @@ That's all. ABP, then will add this prefix to all of your cache keys in your app > **Warning**: If you are building a microservice system, then you will have multiple applications that share the same distributed cache server. In such systems, all applications (or services) should normally use the same cache prefix, because you want all the applications to use the same cache data to have consistency between them. -> **Warning**: Some of the ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured. +> **Warning**: Some of ABP's startup templates are pre-configured to set a prefix value for the distributed cache. So, please check your application code if it is already configured. ## Distributed Lock Prefix From 9d51af23eeef4ec3b08031e364ebb47421401932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 1 Dec 2022 10:27:10 +0300 Subject: [PATCH 76/86] Fix abp.localization.localize method. --- npm/packs/core/src/abp.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/npm/packs/core/src/abp.js b/npm/packs/core/src/abp.js index 5a2747a3c7..7a82f58e98 100644 --- a/npm/packs/core/src/abp.js +++ b/npm/packs/core/src/abp.js @@ -135,14 +135,20 @@ var abp = abp || {}; if (sourceName === '_') { //A convention to suppress the localization return key; } + + if (sourceName) { + return abp.localization.internal.localize.apply(this, arguments).value; + } - sourceName = sourceName || abp.localization.defaultResourceName; - if (!sourceName) { + if (!abp.localization.defaultResourceName) { abp.log.warn('Localization source name is not specified and the defaultResourceName was not defined!'); return key; } - return abp.localization.internal.localize.apply(this, arguments).value; + var copiedArguments = Array.prototype.slice.call(arguments, 0); + copiedArguments.splice(1, 1, abp.localization.defaultResourceName); + + return abp.localization.internal.localize.apply(this, copiedArguments).value; }; abp.localization.isLocalized = function (key, sourceName) { From f96e8b3c859d61f98263a6899ba7a7fe8be20cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 1 Dec 2022 10:30:33 +0300 Subject: [PATCH 77/86] Update Localization.md --- docs/en/UI/AspNetCore/JavaScript-API/Localization.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/UI/AspNetCore/JavaScript-API/Localization.md b/docs/en/UI/AspNetCore/JavaScript-API/Localization.md index 0897b99268..0f6851799a 100644 --- a/docs/en/UI/AspNetCore/JavaScript-API/Localization.md +++ b/docs/en/UI/AspNetCore/JavaScript-API/Localization.md @@ -54,9 +54,9 @@ Assuming the `HelloWelcomeMessage` is localized as `Hello {0}, welcome!`, both o ## Other Properties & Methods -### abp.localization.values +### abp.localization.resources -`abp.localization.values` property stores all the localization resources, keys and their values. +`abp.localization.resources` property stores all the localization resources, keys and their values. ### abp.localization.isLocalized From 13431a1a21be288404dafef070c7621ec3a5d830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 1 Dec 2022 12:54:22 +0300 Subject: [PATCH 78/86] Add Application Localization to document navigation --- docs/en/docs-nav.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index d7cf2a5389..21638f313e 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -614,6 +614,10 @@ { "text": "Application Configuration", "path": "API/Application-Configuration.md" + }, + { + "text": "Application Localization", + "path": "API/Application-Localization.md" } ] }, From e02c44be74c50e9b8f55185c620162b81046726e Mon Sep 17 00:00:00 2001 From: Roc Date: Thu, 1 Dec 2022 21:32:17 +0800 Subject: [PATCH 79/86] Update Index.cshtml --- .../MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml index 48b2d8de02..8c1b75a908 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml @@ -71,7 +71,7 @@ @foreach (var language in Model.Languages) { - @language.DisplayName + @language.DisplayName } @@ -116,4 +116,4 @@ - \ No newline at end of file + From a39010279eeedb24230327e6edf049a7185b12c2 Mon Sep 17 00:00:00 2001 From: Roc Date: Thu, 1 Dec 2022 21:50:30 +0800 Subject: [PATCH 80/86] Update Index.cshtml --- .../MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml index 8c1b75a908..82eed3fa4f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml @@ -71,7 +71,7 @@ @foreach (var language in Model.Languages) { - @language.DisplayName + @language.DisplayName } From 8bb3129995c03aa3548b0c4dc849a06a300727b5 Mon Sep 17 00:00:00 2001 From: Roc Date: Fri, 2 Dec 2022 13:35:38 +0800 Subject: [PATCH 81/86] Update Index.cshtml --- .../MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml index 82eed3fa4f..5c2adb89c0 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/Pages/Index.cshtml @@ -71,7 +71,7 @@ @foreach (var language in Model.Languages) { - @language.DisplayName + @language.DisplayName } From cea5f34b43a7428125189729bdd9dc4b525b7f7a Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 2 Dec 2022 13:57:47 +0800 Subject: [PATCH 82/86] Enhance ABP CLI --- .../Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index b3bdf2d7e9..44b9c20423 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -154,6 +154,11 @@ public abstract class AppTemplateBase : TemplateInfo steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Blazor.Server.Tiered")); } + if (context.BuildArgs.UiFramework != UiFramework.MauiBlazor) + { + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MauiBlazor")); + } + if (context.BuildArgs.UiFramework != UiFramework.Angular) { steps.Add(new RemoveFolderStep("/angular")); From 983cb57b04451b838dfc646aac8643cc7970eeb5 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 2 Dec 2022 12:19:43 +0300 Subject: [PATCH 83/86] Align searchbox for blazor --- .../Pages/Identity/UserManagement.razor | 120 +++++++++--------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor index fdd979b2a0..e72711c6ee 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor @@ -7,51 +7,41 @@ @using Volo.Abp.AspNetCore.Components.Web.Theming.Layout @inject AbpBlazorMessageLocalizerHelper LH -@inherits AbpCrudPageBase +@inherits AbpCrudPageBase @* ************************* PAGE HEADER ************************* *@ - + - - - - - - - - - - - - + + + + @L["Search"] + + + + @* ************************* DATA GRID ************************* *@ - + @* ************************* CREATE MODAL ************************* *@ -@if ( HasCreatePermission ) +@if (HasCreatePermission) {
@L["NewUser"] - + @@ -67,7 +57,7 @@ @L["DisplayName:UserName"] - + @@ -77,7 +67,7 @@ @L["DisplayName:Name"] - + @@ -87,7 +77,7 @@ @L["DisplayName:Surname"] - + @@ -101,10 +91,13 @@ - + - + @@ -112,7 +105,7 @@ @L["DisplayName:Email"] - + @@ -122,26 +115,29 @@ @L["DisplayName:PhoneNumber"] - + - @L["DisplayName:IsActive"] + @L["DisplayName:IsActive"] + - @L["DisplayName:LockoutEnabled"] + + @L["DisplayName:LockoutEnabled"] - + - @if ( NewUserRoles != null ) + @if (NewUserRoles != null) { - @foreach ( var role in NewUserRoles ) + @foreach (var role in NewUserRoles) { - + @role.Name } @@ -153,7 +149,7 @@ - +
@@ -161,18 +157,18 @@ } @* ************************* EDIT MODAL ************************* *@ -@if ( HasUpdatePermission ) +@if (HasUpdatePermission) {
@L["Edit"] - + - + @@ -186,7 +182,7 @@ @L["DisplayName:UserName"] - + @@ -196,7 +192,7 @@ @L["DisplayName:Name"] - + @@ -206,7 +202,7 @@ @L["DisplayName:Surname"] - + @@ -220,10 +216,13 @@ - + - + @@ -231,7 +230,7 @@ @L["DisplayName:Email"] - + @@ -241,26 +240,29 @@ @L["DisplayName:PhoneNumber"] - + - @L["DisplayName:IsActive"] + + @L["DisplayName:IsActive"] - @L["DisplayName:LockoutEnabled"] + + @L["DisplayName:LockoutEnabled"] - + - @if ( EditUserRoles != null ) + @if (EditUserRoles != null) { - @foreach ( var role in EditUserRoles ) + @foreach (var role in EditUserRoles) { - + @role.Name } @@ -272,14 +274,14 @@ - +
} -@if ( HasManagePermissionsPermission ) +@if (HasManagePermissionsPermission) { - + } From eb93990c99e834dda9ac149cedf5459ab02e2869 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 2 Dec 2022 12:27:51 +0300 Subject: [PATCH 84/86] Revert auto-formatting --- .../Pages/Identity/UserManagement.razor | 95 +++++++++---------- 1 file changed, 44 insertions(+), 51 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor index e72711c6ee..8546b00e7f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor @@ -26,22 +26,27 @@ IdentityUserUpdateDto> @* ************************* DATA GRID ************************* *@ - + @* ************************* CREATE MODAL ************************* *@ -@if (HasCreatePermission) +@if ( HasCreatePermission ) {
@L["NewUser"] - + @@ -57,7 +62,7 @@ IdentityUserUpdateDto> @L["DisplayName:UserName"] - + @@ -67,7 +72,7 @@ IdentityUserUpdateDto> @L["DisplayName:Name"] - + @@ -77,7 +82,7 @@ IdentityUserUpdateDto> @L["DisplayName:Surname"] - + @@ -91,13 +96,10 @@ IdentityUserUpdateDto> - + - + @@ -105,7 +107,7 @@ IdentityUserUpdateDto> @L["DisplayName:Email"] - + @@ -115,29 +117,26 @@ IdentityUserUpdateDto> @L["DisplayName:PhoneNumber"] - + - @L["DisplayName:IsActive"] - + @L["DisplayName:IsActive"] - - @L["DisplayName:LockoutEnabled"] + @L["DisplayName:LockoutEnabled"] - + - @if (NewUserRoles != null) + @if ( NewUserRoles != null ) { - @foreach (var role in NewUserRoles) + @foreach ( var role in NewUserRoles ) { - + @role.Name } @@ -149,7 +148,7 @@ IdentityUserUpdateDto> - +
@@ -157,18 +156,18 @@ IdentityUserUpdateDto> } @* ************************* EDIT MODAL ************************* *@ -@if (HasUpdatePermission) +@if ( HasUpdatePermission ) {
@L["Edit"] - + - + @@ -182,7 +181,7 @@ IdentityUserUpdateDto> @L["DisplayName:UserName"] - + @@ -192,7 +191,7 @@ IdentityUserUpdateDto> @L["DisplayName:Name"] - + @@ -202,7 +201,7 @@ IdentityUserUpdateDto> @L["DisplayName:Surname"] - + @@ -216,13 +215,10 @@ IdentityUserUpdateDto> - + - + @@ -230,7 +226,7 @@ IdentityUserUpdateDto> @L["DisplayName:Email"] - + @@ -240,29 +236,26 @@ IdentityUserUpdateDto> @L["DisplayName:PhoneNumber"] - + - - @L["DisplayName:IsActive"] + @L["DisplayName:IsActive"] - - @L["DisplayName:LockoutEnabled"] + @L["DisplayName:LockoutEnabled"] - + - @if (EditUserRoles != null) + @if ( EditUserRoles != null ) { - @foreach (var role in EditUserRoles) + @foreach ( var role in EditUserRoles ) { - + @role.Name } @@ -274,14 +267,14 @@ IdentityUserUpdateDto> - +
} -@if (HasManagePermissionsPermission) +@if ( HasManagePermissionsPermission ) { - -} + +} \ No newline at end of file From a8089b50ad31edba33645aae13e95c08833e1343 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 2 Dec 2022 12:30:14 +0300 Subject: [PATCH 85/86] Revert unnecessary changes --- .../Pages/Identity/UserManagement.razor | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor index 8546b00e7f..f04df90856 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor @@ -7,14 +7,14 @@ @using Volo.Abp.AspNetCore.Components.Web.Theming.Layout @inject AbpBlazorMessageLocalizerHelper LH -@inherits AbpCrudPageBase +@inherits AbpCrudPageBase @* ************************* PAGE HEADER ************************* *@ - - + @@ -277,4 +277,4 @@ IdentityUserUpdateDto> @if ( HasManagePermissionsPermission ) { -} \ No newline at end of file +} From d1d111ef186fb1cd0a7b30a3a946956c0e793297 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 2 Dec 2022 17:39:36 +0800 Subject: [PATCH 86/86] Add MauiBlazorRemoteTenantStore --- .../MauiBlazor/MauiBlazorRemoteTenantStore.cs | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorRemoteTenantStore.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorRemoteTenantStore.cs b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorRemoteTenantStore.cs new file mode 100644 index 0000000000..3cace3f113 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo/Abp/AspNetCore/Components/MauiBlazor/MauiBlazorRemoteTenantStore.cs @@ -0,0 +1,113 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Distributed; +using Pages.Abp.MultiTenancy.ClientProxies; +using Volo.Abp.AspNetCore.Mvc.MultiTenancy; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Threading; +using DependencyAttribute = Volo.Abp.DependencyInjection.DependencyAttribute; + +namespace Volo.Abp.AspNetCore.Components.MauiBlazor; + +[Dependency(ReplaceServices = true)] +public class MauiBlazorRemoteTenantStore : ITenantStore, ITransientDependency +{ + protected AbpTenantClientProxy TenantAppService { get; } + protected IDistributedCache Cache { get; } + + public MauiBlazorRemoteTenantStore(AbpTenantClientProxy tenantAppService, IDistributedCache cache) + { + TenantAppService = tenantAppService; + Cache = cache; + } + + public async Task FindAsync(string name) + { + var cacheKey = CreateCacheKey(name); + + var tenantConfiguration = await Cache.GetOrAddAsync( + cacheKey, + async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name)), + () => new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = + TimeSpan.FromMinutes(5) //TODO: Should be configurable. + } + ); + + return tenantConfiguration; + } + + public async Task FindAsync(Guid id) + { + var cacheKey = CreateCacheKey(id); + + var tenantConfiguration = await Cache.GetOrAddAsync( + cacheKey, + async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id)), + () => new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = + TimeSpan.FromMinutes(5) //TODO: Should be configurable. + } + ); + + return tenantConfiguration; + } + + public TenantConfiguration Find(string name) + { + var cacheKey = CreateCacheKey(name); + + var tenantConfiguration = Cache.GetOrAdd( + cacheKey, + () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByNameAsync(name))), + () => new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = + TimeSpan.FromMinutes(5) //TODO: Should be configurable. + } + ); + + return tenantConfiguration; + } + + public TenantConfiguration Find(Guid id) + { + var cacheKey = CreateCacheKey(id); + + var tenantConfiguration = Cache.GetOrAdd( + cacheKey, + () => AsyncHelper.RunSync(async () => CreateTenantConfiguration(await TenantAppService.FindTenantByIdAsync(id))), + () => new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = + TimeSpan.FromMinutes(5) //TODO: Should be configurable. + } + ); + + return tenantConfiguration; + } + + protected virtual TenantConfiguration CreateTenantConfiguration(FindTenantResultDto tenantResultDto) + { + if (!tenantResultDto.Success || tenantResultDto.TenantId == null) + { + return null; + } + + return new TenantConfiguration(tenantResultDto.TenantId.Value, tenantResultDto.Name); + } + + protected virtual string CreateCacheKey(string tenantName) + { + return $"RemoteTenantStore_Name_{tenantName}"; + } + + protected virtual string CreateCacheKey(Guid tenantId) + { + return $"RemoteTenantStore_Id_{tenantId:N}"; + } +} \ No newline at end of file

(MCT+)bYBNe2ymKKQ<^+?&6A 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 r=Z8|TWk}`9&1nQ{S}}7 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