diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json index 82ffbf0f4c..442384bd0a 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en-GB.json @@ -32,6 +32,7 @@ "SeeDocuments": "See Documents", "Samples": "Samples", "FreeDDDBook": "Free DDD E-book", - "New": "New" + "New": "New", + "Volo.AbpIo.Domain:020005": "License extend year can not be lower than {MinExtendLicenseYear} year and greater than {MaxExtendLicenseYear} years " } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index 646c2f9648..b9c8d23563 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -34,6 +34,7 @@ "Framework": "Framework", "Support": "Support", "FreeDDDBook": "Free DDD E-book", - "New": "New" + "New": "New", + "Volo.AbpIo.Domain:020005": "License extend year can not be lower than {MinExtendLicenseYear} year and greater than {MaxExtendLicenseYear} years " } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json index 2f932f299b..04c114a6c2 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json @@ -28,6 +28,7 @@ "Commercial": "Ticari", "SeeDocuments": "Dokümanlara Göz Atın", "FreeDDDBook": "Ücretsiz DDD Kitabı", - "New": "Yeni" + "New": "Yeni", + "Volo.AbpIo.Domain:020005": "Lisans uzatma yılı {MinExtendLicenseYear} yıldan az {MaxExtendLicenseYear} yıldan fazla olamaz." } } \ No newline at end of file diff --git a/docs/en/Domain-Driven-Design.md b/docs/en/Domain-Driven-Design.md index f18c1882ef..03a6232ba3 100644 --- a/docs/en/Domain-Driven-Design.md +++ b/docs/en/Domain-Driven-Design.md @@ -32,6 +32,6 @@ DDD mostly interest in the **Domain** and the **Application** layers, rather tha * [Data Transfer Objects (DTOs)](Data-Transfer-Objects.md) * [Unit of Work](Unit-Of-Work.md) -## The Ultimate DDD Implementation Guide +## Free E-Book: Implementing DDD -See the [Implementing Domain Driven Design](Domain-Driven-Design-Implementation-Guide.md) guide as a **complete reference**. The Guide explains the Domain Driven Design and introduces explicit **rules and examples** to give a deep understanding of the **implementation details**. \ No newline at end of file +See the [Implementing Domain Driven Design book](https://abp.io/books/implementing-domain-driven-design) as a **complete reference**. This book explains the Domain Driven Design and introduces explicit **rules and examples** to give a deep understanding of the **implementation details**. \ No newline at end of file diff --git a/docs/en/Index.md b/docs/en/Index.md index de88e2f2f8..8483d61612 100644 --- a/docs/en/Index.md +++ b/docs/en/Index.md @@ -29,8 +29,9 @@ ABP has a **comprehensive documentation** that not only explains the ABP Framewo ABP offers a complete, modular and layered software architecture based on [Domain Driven Design](Domain-Driven-Design.md) principles and patterns. It also provides the necessary infrastructure to implement this architecture. * See the [Modularity](Module-Development-Basics.md) document to understand the module system. -* [Implementing Domain Driven Design](Domain-Driven-Design-Implementation-Guide.md) document is an ultimate guide for who want to understand and implement the DDD. +* [Implementing Domain Driven Design book](https://abp.io/books/implementing-domain-driven-design?ref=doc) is an ultimate guide for who want to understand and implement the DDD with the ABP Framework. * [Microservice Architecture](Microservice-Architecture.md) document explains how ABP helps to create a microservice solution. +* [Multi-Tenancy](Multi-Tenancy.md) document introduces multi-tenancy and explores the ABP multi-tenancy infrastructure. ### Infrastructure @@ -55,6 +56,14 @@ See the [Application Modules](Modules/Index.md) document for all pre-built modul The [Startup templates](Startup-Templates/Index.md) are pre-built Visual Studio solution templates. You can create your own solution based on these templates to **immediately start your development**. +## Free E-Book: Implementing Domain Driven Design + +![Implementing Domain Driven Design](images/implementing-domain-driven-design-book.png) + +A **practical guide** for implementing Domain Driven Design (DDD). While the implementation details are **based on the ABP Framework** infrastructure, the basic concepts, principles and models can be applied to any solution, even if it is not a .NET solution. + +[Click here to get your free copy](https://abp.io/books/implementing-domain-driven-design?ref=doc). + ## ABP Community ### The Source Code diff --git a/docs/en/Road-Map.md b/docs/en/Road-Map.md index f57e35c863..26de749096 100644 --- a/docs/en/Road-Map.md +++ b/docs/en/Road-Map.md @@ -8,11 +8,9 @@ This document provides a road map, release schedule and planned features for the This version will focus on **documentation** and **improvements** of current features. In addition, the following features are planned: -* Publishing distributed events as transactional ([#6126](https://github.com/abpframework/abp/issues/6126)) * Revisit the microservice demo solution ([#8385](https://github.com/abpframework/abp/issues/8385)) * A new UI Theme alternative to the Basic Theme ([#6132](https://github.com/abpframework/abp/issues/6132)) * Improvements and new features to the [CMS Kit](Modules/Cms-Kit.md) module ([#8380](https://github.com/abpframework/abp/issues/8380) [#8381](https://github.com/abpframework/abp/issues/8381)) -* Pre-configured test project for the [Blazor UI](UI/Blazor/Overall.md) ([#5516](https://github.com/abpframework/abp/issues/5516)) * Razor engine support for text templating ([#8373](https://github.com/abpframework/abp/issues/8373)) **Planned release date**: End of Quarter 2, 2021. See the [4.4 milestone](https://github.com/abpframework/abp/milestone/52) to track the progress. @@ -25,6 +23,7 @@ We planned to focus on the ABP Framework v5.0 after the 4.4 release. This versio * Upgrading to Bootstrap 5.x ([#8922](https://github.com/abpframework/abp/issues/8922)) * Alternative to IdentityServer4 ([#7221](https://github.com/abpframework/abp/issues/7221)) * Dapr integration ([#2183](https://github.com/abpframework/abp/issues/2183)) +* Publishing distributed events as transactional ([#6126](https://github.com/abpframework/abp/issues/6126)) * Resource based authorization system ([#236](https://github.com/abpframework/abp/issues/236)) * API Versioning system: finalize & document ([#497](https://github.com/abpframework/abp/issues/497)) * Performance optimizations; Enabling .NET Trimming, using source generators and reducing reflection, etc. diff --git a/docs/en/images/implementing-domain-driven-design-book.png b/docs/en/images/implementing-domain-driven-design-book.png new file mode 100644 index 0000000000..6568b46f66 Binary files /dev/null and b/docs/en/images/implementing-domain-driven-design-book.png differ diff --git a/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj b/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj index 7e742c0467..036144e8c6 100644 --- a/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj +++ b/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj @@ -16,7 +16,7 @@ - + diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs index ee172b3409..886d8e020c 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/AbpCommonDbContextRegistrationOptions.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.DependencyInjection public IServiceCollection Services { get; } - public List ReplacedDbContextTypes { get; } + public Dictionary ReplacedDbContextTypes { get; } public Type DefaultRepositoryDbContextType { get; protected set; } @@ -39,7 +39,7 @@ namespace Volo.Abp.DependencyInjection Services = services; DefaultRepositoryDbContextType = originalDbContextType; CustomRepositories = new Dictionary(); - ReplacedDbContextTypes = new List(); + ReplacedDbContextTypes = new Dictionary(); SpecifiedDefaultRepositories = new List(); } @@ -47,15 +47,20 @@ namespace Volo.Abp.DependencyInjection { return ReplaceDbContext(typeof(TOtherDbContext)); } + + public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext() + { + return ReplaceDbContext(typeof(TOtherDbContext), typeof(TTargetDbContext)); + } - public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType) + public IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType, Type targetDbContextType = null) { if (!otherDbContextType.IsAssignableFrom(OriginalDbContextType)) { throw new AbpException($"{OriginalDbContextType.AssemblyQualifiedName} should inherit/implement {otherDbContextType.AssemblyQualifiedName}!"); } - ReplacedDbContextTypes.AddIfNotContains(otherDbContextType); + ReplacedDbContextTypes[otherDbContextType] = targetDbContextType; return this; } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs index 34e74d90cd..248300ab62 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/DependencyInjection/IAbpCommonDbContextRegistrationOptionsBuilder.cs @@ -75,9 +75,17 @@ namespace Volo.Abp.DependencyInjection IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(); /// - /// Replaces given DbContext type with this DbContext type. + /// Replaces given DbContext type with the target DbContext type. + /// + /// The DbContext type to be replaced + /// The target DbContext type + IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(); + + /// + /// Replaces given DbContext type with the given or this DbContext type. /// /// The DbContext type to be replaced - IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType); + /// The target DbContext type (optional, used this DbContext type if not provided) + IAbpCommonDbContextRegistrationOptionsBuilder ReplaceDbContext(Type otherDbContextType, Type targetDbContextType = null); } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs index a48575ddcc..658269a376 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Microsoft/Extensions/DependencyInjection/AbpEfCoreServiceCollectionExtensions.cs @@ -31,18 +31,21 @@ namespace Microsoft.Extensions.DependencyInjection services.TryAddTransient(DbContextOptionsFactory.Create); - foreach (var dbContextType in options.ReplacedDbContextTypes) + foreach (var entry in options.ReplacedDbContextTypes) { + var originalDbContextType = entry.Key; + var targetDbContextType = entry.Value ?? typeof(TDbContext); + services.Replace( ServiceDescriptor.Transient( - dbContextType, - sp => sp.GetRequiredService(typeof(TDbContext)) + originalDbContextType, + sp => sp.GetRequiredService(targetDbContextType) ) ); services.Configure(opts => { - opts.DbContextReplacements[dbContextType] = typeof(TDbContext); + opts.DbContextReplacements[originalDbContextType] = targetDbContextType; }); } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index 22f04542f1..9b488924e8 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -371,17 +371,20 @@ namespace Volo.Abp.EntityFrameworkCore protected virtual void ApplyAbpConceptsForModifiedEntity(EntityEntry entry, EntityChangeReport changeReport) { - UpdateConcurrencyStamp(entry); - SetModificationAuditProperties(entry); - - if (entry.Entity is ISoftDelete && entry.Entity.As().IsDeleted) - { - SetDeletionAuditProperties(entry); - changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted)); - } - else + if (entry.State == EntityState.Modified && entry.Properties.Any(x => x.IsModified && x.Metadata.ValueGenerated == ValueGenerated.Never)) { - changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Updated)); + UpdateConcurrencyStamp(entry); + SetModificationAuditProperties(entry); + + if (entry.Entity is ISoftDelete && entry.Entity.As().IsDeleted) + { + SetDeletionAuditProperties(entry); + changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted)); + } + else + { + changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Updated)); + } } } diff --git a/framework/src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs b/framework/src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs index 3cab95cb03..99ef1bd445 100644 --- a/framework/src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.MemoryDb/Microsoft/Extensions/DependencyInjection/AbpMemoryDbServiceCollectionExtensions.cs @@ -18,9 +18,17 @@ namespace Microsoft.Extensions.DependencyInjection services.TryAddSingleton(options.DefaultRepositoryDbContextType, sp => sp.GetRequiredService()); } - foreach (var dbContextType in options.ReplacedDbContextTypes) + foreach (var entry in options.ReplacedDbContextTypes) { - services.Replace(ServiceDescriptor.Singleton(dbContextType, sp => sp.GetRequiredService())); + var originalDbContextType = entry.Key; + var targetDbContextType = entry.Value ?? typeof(TMemoryDbContext); + + services.Replace( + ServiceDescriptor.Singleton( + originalDbContextType, + sp => sp.GetRequiredService(targetDbContextType) + ) + ); } new MemoryDbRepositoryRegistrar(options).AddRepositories(); diff --git a/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs b/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs index 7f9c6b8d42..c05dbe5b3a 100644 --- a/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.MongoDB/Microsoft/Extensions/DependencyInjection/AbpMongoDbServiceCollectionExtensions.cs @@ -25,23 +25,21 @@ namespace Microsoft.Extensions.DependencyInjection optionsBuilder?.Invoke(options); - foreach (var dbContextType in options.ReplacedDbContextTypes) - { - services.Replace(ServiceDescriptor.Transient(dbContextType, typeof(TMongoDbContext))); - } - - foreach (var dbContextType in options.ReplacedDbContextTypes) + foreach (var entry in options.ReplacedDbContextTypes) { + var originalDbContextType = entry.Key; + var targetDbContextType = entry.Value ?? typeof(TMongoDbContext); + services.Replace( ServiceDescriptor.Transient( - dbContextType, - sp => sp.GetRequiredService(typeof(TMongoDbContext)) + originalDbContextType, + sp => sp.GetRequiredService(targetDbContextType) ) ); services.Configure(opts => { - opts.DbContextReplacements[dbContextType] = typeof(TMongoDbContext); + opts.DbContextReplacements[originalDbContextType] = targetDbContextType; }); } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs index d1b1018e5c..ee1ca3572c 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Auditing/Auditing_Tests.cs @@ -1,9 +1,53 @@ -using Volo.Abp.TestApp.Testing; +using System; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.TestApp; +using Volo.Abp.TestApp.Testing; +using Xunit; namespace Volo.Abp.EntityFrameworkCore.Auditing { public class Auditing_Tests : Auditing_Tests { + [Fact] + public async Task Should_Not_Set_Modification_If_Properties_Generated_By_Database() + { + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.LastActiveTime = DateTime.Now; + })); + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId); + + douglas.ShouldNotBeNull(); + douglas.LastModificationTime.ShouldBeNull(); + douglas.LastModificationTime.ShouldBeNull(); + douglas.LastModifierId.ShouldBeNull(); + })); + } + + [Fact] + public async Task Should_Set_Modification_If_Properties_Not_Generated_By_Database() + { + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.GetAsync(TestDataBuilder.UserDouglasId); + douglas.LastActiveTime = DateTime.Now; + douglas.Age = 100; + })); + + await WithUnitOfWorkAsync((async () => + { + var douglas = await PersonRepository.FindAsync(TestDataBuilder.UserDouglasId); + + douglas.ShouldNotBeNull(); + douglas.LastModificationTime.ShouldNotBeNull(); + douglas.LastModificationTime.Value.ShouldBeLessThanOrEqualTo(Clock.Now); + douglas.LastModifierId.ShouldBe(CurrentUserId); + })); + } } } diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs index 23137f0f0c..516c7d5789 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/TestMigrationsDbContext.cs @@ -1,3 +1,4 @@ +using System; using Microsoft.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.TestApp.SecondContext; using Volo.Abp.EntityFrameworkCore.TestApp.ThirdDbContext; @@ -16,10 +17,10 @@ namespace Volo.Abp.EntityFrameworkCore public DbSet Books { get; set; } public DbSet EntityWithIntPks { get; set; } - + public DbSet Author { get; set; } - - public TestMigrationsDbContext(DbContextOptions options) + + public TestMigrationsDbContext(DbContextOptions options) : base(options) { @@ -36,6 +37,12 @@ namespace Volo.Abp.EntityFrameworkCore b.HasKey(p => new { p.PersonId, p.Number }); }); + + modelBuilder.Entity(b => + { + b.Property(x => x.LastActiveTime).ValueGeneratedOnAddOrUpdate().HasDefaultValue(DateTime.Now); + }); + modelBuilder.Entity(b => { b.OwnsMany(c => c.Districts, d => diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs index 6263c116b8..014c9c42db 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/TestApp/EntityFrameworkCore/TestAppDbContext.cs @@ -1,4 +1,5 @@ -using Microsoft.EntityFrameworkCore; +using System; +using Microsoft.EntityFrameworkCore; using Volo.Abp.DependencyInjection; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.Modeling; @@ -46,6 +47,11 @@ namespace Volo.Abp.TestApp.EntityFrameworkCore b.ApplyObjectExtensionMappings(); }); + modelBuilder.Entity(b => + { + b.Property(x => x.LastActiveTime).ValueGeneratedOnAddOrUpdate().HasDefaultValue(DateTime.Now); + }); + modelBuilder .Entity(p => { diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs index 9075740f11..f88e617072 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs @@ -23,9 +23,10 @@ namespace Volo.Abp.TestApp.Domain public virtual Collection Phones { get; set; } + public virtual DateTime LastActiveTime { get; set; } + private Person() { - } public Person(Guid id, string name, int age, Guid? tenantId = null, Guid? cityId = null) @@ -65,4 +66,4 @@ namespace Volo.Abp.TestApp.Domain ); } } -} \ No newline at end of file +} diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts index ea8a9dad8f..776785ed4c 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts @@ -66,7 +66,7 @@ export interface ExtensionPropertyUiDto { onTable: ExtensionPropertyUiTableDto; onCreateForm: ExtensionPropertyUiFormDto; onEditForm: ExtensionPropertyUiFormDto; - lookup: ExtensionPropertyUiLookupDto; + lookup?: ExtensionPropertyUiLookupDto; } export interface ExtensionPropertyUiFormDto { diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts b/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts index c0581aae45..f9538a25eb 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts @@ -148,7 +148,7 @@ function createMockEntities(): Record - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs index 3ff7058579..148dcbcf06 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Account; +using MyCompanyName.MyProjectName.Blazor.WebAssembly; using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic; using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; using Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme; @@ -26,7 +27,7 @@ namespace MyCompanyName.MyProjectName.Blazor.Host typeof(AbpIdentityBlazorWebAssemblyModule), typeof(AbpTenantManagementBlazorWebAssemblyModule), typeof(AbpSettingManagementBlazorWebAssemblyModule), - typeof(MyProjectNameBlazorModule) + typeof(MyProjectNameBlazorWebAssemblyModule) )] public class MyProjectNameBlazorHostModule : AbpModule {