Browse Source

use file-scoped namespacing for module template

pull/10696/head
Ahmet Çotur 5 years ago
parent
commit
d1d9c47cde
  1. 11
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostAutoMapperProfile.cs
  2. 17
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostBundleContributor.cs
  3. 127
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs
  4. 9
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostBrandingProvider.cs
  5. 51
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostMenuContributor.cs
  6. 25
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs
  7. 33
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/EntityFrameworkCore/UnifiedDbContext.cs
  8. 31
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/EntityFrameworkCore/UnifiedDbContextFactory.cs
  9. 43
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Menus/MyProjectNameMenuContributor.cs
  10. 11
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Menus/MyProjectNameMenus.cs
  11. 1391
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20211105130007_Initial.cs
  12. 333
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs
  13. 11
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBrandingProvider.cs
  14. 11
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameComponentBase.cs
  15. 7
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Pages/Index.razor.cs
  16. 65
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs
  17. 19
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Startup.cs
  18. 15
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Host.Shared/MultiTenancy/MultiTenancyConsts.cs
  19. 11
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Controllers/HomeController.cs
  20. 21
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/EntityFrameworkCore/MyProjectNameHttpApiHostMigrationsDbContext.cs
  21. 31
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/EntityFrameworkCore/MyProjectNameHttpApiHostMigrationsDbContextFactory.cs
  22. 271
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
  23. 63
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs
  24. 19
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs
  25. 33
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/EntityFrameworkCore/IdentityServerHostMigrationsDbContext.cs
  26. 31
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/EntityFrameworkCore/IdentityServerHostMigrationsDbContextFactory.cs
  27. 469
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs
  28. 2528
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20211105130012_Initial.cs
  29. 325
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
  30. 11
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Pages/Index.cshtml.cs
  31. 63
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs
  32. 19
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Startup.cs
  33. 7
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Controllers/AccountController.cs
  34. 11
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameBrandingProvider.cs
  35. 11
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebAutoMapperProfile.cs
  36. 69
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostMenuContributor.cs
  37. 337
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs
  38. 21
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Pages/Index.cshtml.cs
  39. 13
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Pages/MyProjectNamePageModel.cs
  40. 63
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs
  41. 19
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Startup.cs
  42. 33
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/EntityFrameworkCore/UnifiedDbContext.cs
  43. 31
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/EntityFrameworkCore/UnifiedDbContextFactory.cs
  44. 1391
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20211105130018_Initial.cs
  45. 247
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs
  46. 11
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Pages/Index.cshtml.cs
  47. 67
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs
  48. 19
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Startup.cs
  49. 17
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyProjectNameApplicationContractsModule.cs
  50. 11
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyProjectNameRemoteServiceConsts.cs
  51. 21
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs
  52. 17
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissions.cs
  53. 11
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Samples/ISampleAppService.cs
  54. 11
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Samples/SampleDto.cs
  55. 13
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyProjectNameAppService.cs
  56. 17
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationAutoMapperProfile.cs
  57. 29
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs
  58. 43
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/Samples/SampleAppService.cs
  59. 19
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorServerModule.cs
  60. 21
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyProjectNameBlazorWebAssemblyModule.cs
  61. 29
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs
  62. 15
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenus.cs
  63. 17
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorAutoMapperProfile.cs
  64. 47
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs
  65. 11
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectNameResource.cs
  66. 43
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs
  67. 9
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameErrorCodes.cs
  68. 13
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDbProperties.cs
  69. 15
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs
  70. 17
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Settings/MyProjectNameSettingDefinitionProvider.cs
  71. 17
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Settings/MyProjectNameSettings.cs
  72. 17
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/IMyProjectNameDbContext.cs
  73. 33
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContext.cs
  74. 41
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContextModelCreatingExtensions.cs
  75. 23
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreModule.cs
  76. 31
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyProjectNameHttpApiClientModule.cs
  77. 11
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyProjectNameController.cs
  78. 37
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyProjectNameHttpApiModule.cs
  79. 45
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/Samples/SampleController.cs
  80. 23
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyProjectNameInstallerModule.cs
  81. 15
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyProjectNameInstallerPipelineBuilder.cs
  82. 15
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDB/IMyProjectNameMongoDbContext.cs
  83. 25
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDB/MyProjectNameMongoDbContext.cs
  84. 13
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDB/MyProjectNameMongoDbContextExtensions.cs
  85. 21
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDB/MyProjectNameMongoDbModule.cs
  86. 27
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs
  87. 15
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenus.cs
  88. 17
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebAutoMapperProfile.cs
  89. 67
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
  90. 11
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/MyProjectName/Index.cshtml.cs
  91. 19
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/MyProjectNamePageModel.cs
  92. 15
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationTestBase.cs
  93. 15
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationTestModule.cs
  94. 39
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/Samples/SampleAppService_Tests.cs
  95. 15
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestBase.cs
  96. 23
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestModule.cs
  97. 23
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/Samples/SampleManager_Tests.cs
  98. 15
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestBase.cs
  99. 53
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs
  100. 15
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepository_Tests.cs

11
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostAutoMapperProfile.cs

@ -1,12 +1,11 @@
using AutoMapper; using AutoMapper;
namespace MyCompanyName.MyProjectName.Blazor.Host namespace MyCompanyName.MyProjectName.Blazor.Host;
public class MyProjectNameBlazorHostAutoMapperProfile : Profile
{ {
public class MyProjectNameBlazorHostAutoMapperProfile : Profile public MyProjectNameBlazorHostAutoMapperProfile()
{ {
public MyProjectNameBlazorHostAutoMapperProfile() //Define your AutoMapper configuration here for the Blazor project.
{
//Define your AutoMapper configuration here for the Blazor project.
}
} }
} }

17
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostBundleContributor.cs

@ -1,17 +1,16 @@
using Volo.Abp.Bundling; using Volo.Abp.Bundling;
namespace MyCompanyName.MyProjectName.Blazor.Host namespace MyCompanyName.MyProjectName.Blazor.Host;
public class MyProjectNameBlazorHostBundleContributor : IBundleContributor
{ {
public class MyProjectNameBlazorHostBundleContributor : IBundleContributor public void AddScripts(BundleContext context)
{ {
public void AddScripts(BundleContext context)
{
} }
public void AddStyles(BundleContext context) public void AddStyles(BundleContext context)
{ {
context.Add("main.css", true); context.Add("main.css", true);
}
} }
} }

127
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameBlazorHostModule.cs

@ -18,84 +18,83 @@ using Volo.Abp.SettingManagement.Blazor.WebAssembly;
using Volo.Abp.TenantManagement.Blazor.WebAssembly; using Volo.Abp.TenantManagement.Blazor.WebAssembly;
using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation;
namespace MyCompanyName.MyProjectName.Blazor.Host namespace MyCompanyName.MyProjectName.Blazor.Host;
[DependsOn(
typeof(AbpAutofacWebAssemblyModule),
typeof(AbpAspNetCoreComponentsWebAssemblyBasicThemeModule),
typeof(AbpAccountApplicationContractsModule),
typeof(AbpIdentityBlazorWebAssemblyModule),
typeof(AbpTenantManagementBlazorWebAssemblyModule),
typeof(AbpSettingManagementBlazorWebAssemblyModule),
typeof(MyProjectNameBlazorWebAssemblyModule)
)]
public class MyProjectNameBlazorHostModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(AbpAutofacWebAssemblyModule),
typeof(AbpAspNetCoreComponentsWebAssemblyBasicThemeModule),
typeof(AbpAccountApplicationContractsModule),
typeof(AbpIdentityBlazorWebAssemblyModule),
typeof(AbpTenantManagementBlazorWebAssemblyModule),
typeof(AbpSettingManagementBlazorWebAssemblyModule),
typeof(MyProjectNameBlazorWebAssemblyModule)
)]
public class MyProjectNameBlazorHostModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) var environment = context.Services.GetSingletonInstance<IWebAssemblyHostEnvironment>();
{ var builder = context.Services.GetSingletonInstance<WebAssemblyHostBuilder>();
var environment = context.Services.GetSingletonInstance<IWebAssemblyHostEnvironment>();
var builder = context.Services.GetSingletonInstance<WebAssemblyHostBuilder>();
ConfigureAuthentication(builder); ConfigureAuthentication(builder);
ConfigureHttpClient(context, environment); ConfigureHttpClient(context, environment);
ConfigureBlazorise(context); ConfigureBlazorise(context);
ConfigureRouter(context); ConfigureRouter(context);
ConfigureUI(builder); ConfigureUI(builder);
ConfigureMenu(context); ConfigureMenu(context);
ConfigureAutoMapper(context); ConfigureAutoMapper(context);
} }
private void ConfigureRouter(ServiceConfigurationContext context) private void ConfigureRouter(ServiceConfigurationContext context)
{
Configure<AbpRouterOptions>(options =>
{ {
Configure<AbpRouterOptions>(options => options.AppAssembly = typeof(MyProjectNameBlazorHostModule).Assembly;
{ });
options.AppAssembly = typeof(MyProjectNameBlazorHostModule).Assembly; }
});
}
private void ConfigureMenu(ServiceConfigurationContext context) private void ConfigureMenu(ServiceConfigurationContext context)
{
Configure<AbpNavigationOptions>(options =>
{ {
Configure<AbpNavigationOptions>(options => options.MenuContributors.Add(new MyProjectNameHostMenuContributor(context.Services.GetConfiguration()));
{ });
options.MenuContributors.Add(new MyProjectNameHostMenuContributor(context.Services.GetConfiguration())); }
});
}
private void ConfigureBlazorise(ServiceConfigurationContext context) private void ConfigureBlazorise(ServiceConfigurationContext context)
{ {
context.Services context.Services
.AddBootstrap5Providers() .AddBootstrap5Providers()
.AddFontAwesomeIcons(); .AddFontAwesomeIcons();
} }
private static void ConfigureAuthentication(WebAssemblyHostBuilder builder) private static void ConfigureAuthentication(WebAssemblyHostBuilder builder)
{
builder.Services.AddOidcAuthentication(options =>
{ {
builder.Services.AddOidcAuthentication(options => builder.Configuration.Bind("AuthServer", options.ProviderOptions);
{ options.ProviderOptions.DefaultScopes.Add("MyProjectName");
builder.Configuration.Bind("AuthServer", options.ProviderOptions); });
options.ProviderOptions.DefaultScopes.Add("MyProjectName"); }
});
}
private static void ConfigureUI(WebAssemblyHostBuilder builder) private static void ConfigureUI(WebAssemblyHostBuilder builder)
{ {
builder.RootComponents.Add<App>("#ApplicationContainer"); builder.RootComponents.Add<App>("#ApplicationContainer");
} }
private static void ConfigureHttpClient(ServiceConfigurationContext context, IWebAssemblyHostEnvironment environment) private static void ConfigureHttpClient(ServiceConfigurationContext context, IWebAssemblyHostEnvironment environment)
{
context.Services.AddTransient(sp => new HttpClient
{ {
context.Services.AddTransient(sp => new HttpClient BaseAddress = new Uri(environment.BaseAddress)
{ });
BaseAddress = new Uri(environment.BaseAddress) }
});
}
private void ConfigureAutoMapper(ServiceConfigurationContext context) private void ConfigureAutoMapper(ServiceConfigurationContext context)
{
Configure<AbpAutoMapperOptions>(options =>
{ {
Configure<AbpAutoMapperOptions>(options => options.AddMaps<MyProjectNameBlazorHostModule>();
{ });
options.AddMaps<MyProjectNameBlazorHostModule>();
});
}
} }
} }

9
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostBrandingProvider.cs

@ -1,9 +1,8 @@
using Volo.Abp.Ui.Branding; using Volo.Abp.Ui.Branding;
namespace MyCompanyName.MyProjectName.Blazor.Host namespace MyCompanyName.MyProjectName.Blazor.Host;
public class MyProjectNameHostBrandingProvider : DefaultBrandingProvider
{ {
public class MyProjectNameHostBrandingProvider : DefaultBrandingProvider public override string AppName => "MyProjectName";
{
public override string AppName => "MyProjectName";
}
} }

51
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyProjectNameHostMenuContributor.cs

@ -4,40 +4,39 @@ using Microsoft.Extensions.Configuration;
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation;
using Volo.Abp.Account.Localization; using Volo.Abp.Account.Localization;
namespace MyCompanyName.MyProjectName.Blazor.Host namespace MyCompanyName.MyProjectName.Blazor.Host;
public class MyProjectNameHostMenuContributor : IMenuContributor
{ {
public class MyProjectNameHostMenuContributor : IMenuContributor private readonly IConfiguration _configuration;
{
private readonly IConfiguration _configuration;
public MyProjectNameHostMenuContributor(IConfiguration configuration) public MyProjectNameHostMenuContributor(IConfiguration configuration)
{ {
_configuration = configuration; _configuration = configuration;
} }
public async Task ConfigureMenuAsync(MenuConfigurationContext context) public async Task ConfigureMenuAsync(MenuConfigurationContext context)
{
if (context.Menu.Name == StandardMenus.User)
{ {
if (context.Menu.Name == StandardMenus.User) await ConfigureUserMenuAsync(context);
{
await ConfigureUserMenuAsync(context);
}
} }
}
private Task ConfigureUserMenuAsync(MenuConfigurationContext context) private Task ConfigureUserMenuAsync(MenuConfigurationContext context)
{ {
var accountStringLocalizer = context.GetLocalizer<AccountResource>(); var accountStringLocalizer = context.GetLocalizer<AccountResource>();
var identityServerUrl = _configuration["AuthServer:Authority"] ?? ""; var identityServerUrl = _configuration["AuthServer:Authority"] ?? "";
context.Menu.AddItem(new ApplicationMenuItem( context.Menu.AddItem(new ApplicationMenuItem(
"Account.Manage", "Account.Manage",
accountStringLocalizer["ManageYourProfile"], accountStringLocalizer["ManageYourProfile"],
$"{identityServerUrl.EnsureEndsWith('/')}Account/Manage?returnUrl={_configuration["App:SelfUrl"]}", $"{identityServerUrl.EnsureEndsWith('/')}Account/Manage?returnUrl={_configuration["App:SelfUrl"]}",
icon: "fa fa-cog", icon: "fa fa-cog",
order: 1000, order: 1000,
null).RequireAuthenticated()); null).RequireAuthenticated());
return Task.CompletedTask; return Task.CompletedTask;
}
} }
} }

25
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/Program.cs

@ -1,24 +1,23 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
namespace MyCompanyName.MyProjectName.Blazor.Host namespace MyCompanyName.MyProjectName.Blazor.Host;
public class Program
{ {
public class Program public static async Task Main(string[] args)
{ {
public static async Task Main(string[] args) var builder = WebAssemblyHostBuilder.CreateDefault(args);
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
var application = builder.AddApplication<MyProjectNameBlazorHostModule>(options => var application = builder.AddApplication<MyProjectNameBlazorHostModule>(options =>
{ {
options.UseAutofac(); options.UseAutofac();
}); });
var host = builder.Build(); var host = builder.Build();
await application.InitializeAsync(host.Services); await application.InitializeAsync(host.Services);
await host.RunAsync(); await host.RunAsync();
}
} }
} }

33
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/EntityFrameworkCore/UnifiedDbContext.cs

@ -8,27 +8,26 @@ using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.TenantManagement.EntityFrameworkCore; using Volo.Abp.TenantManagement.EntityFrameworkCore;
namespace MyCompanyName.MyProjectName.Blazor.Server.Host.EntityFrameworkCore namespace MyCompanyName.MyProjectName.Blazor.Server.Host.EntityFrameworkCore;
public class UnifiedDbContext : AbpDbContext<UnifiedDbContext>
{ {
public class UnifiedDbContext : AbpDbContext<UnifiedDbContext> public UnifiedDbContext(DbContextOptions<UnifiedDbContext> options)
: base(options)
{ {
public UnifiedDbContext(DbContextOptions<UnifiedDbContext> options)
: base(options)
{
} }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
modelBuilder.ConfigurePermissionManagement(); modelBuilder.ConfigurePermissionManagement();
modelBuilder.ConfigureSettingManagement(); modelBuilder.ConfigureSettingManagement();
modelBuilder.ConfigureAuditLogging(); modelBuilder.ConfigureAuditLogging();
modelBuilder.ConfigureIdentity(); modelBuilder.ConfigureIdentity();
modelBuilder.ConfigureFeatureManagement(); modelBuilder.ConfigureFeatureManagement();
modelBuilder.ConfigureTenantManagement(); modelBuilder.ConfigureTenantManagement();
modelBuilder.ConfigureMyProjectName(); modelBuilder.ConfigureMyProjectName();
}
} }
} }

31
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/EntityFrameworkCore/UnifiedDbContextFactory.cs

@ -3,27 +3,26 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
namespace MyCompanyName.MyProjectName.Blazor.Server.Host.EntityFrameworkCore namespace MyCompanyName.MyProjectName.Blazor.Server.Host.EntityFrameworkCore;
public class UnifiedDbContextFactory : IDesignTimeDbContextFactory<UnifiedDbContext>
{ {
public class UnifiedDbContextFactory : IDesignTimeDbContextFactory<UnifiedDbContext> public UnifiedDbContext CreateDbContext(string[] args)
{ {
public UnifiedDbContext CreateDbContext(string[] args) var configuration = BuildConfiguration();
{
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<UnifiedDbContext>() var builder = new DbContextOptionsBuilder<UnifiedDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default")); .UseSqlServer(configuration.GetConnectionString("Default"));
return new UnifiedDbContext(builder.Options); return new UnifiedDbContext(builder.Options);
} }
private static IConfigurationRoot BuildConfiguration() private static IConfigurationRoot BuildConfiguration()
{ {
var builder = new ConfigurationBuilder() var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory()) .SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false); .AddJsonFile("appsettings.json", optional: false);
return builder.Build(); return builder.Build();
}
} }
} }

43
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Menus/MyProjectNameMenuContributor.cs

@ -5,35 +5,34 @@ using Volo.Abp.SettingManagement.Blazor.Menus;
using Volo.Abp.TenantManagement.Blazor.Navigation; using Volo.Abp.TenantManagement.Blazor.Navigation;
using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation;
namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Menus namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Menus;
public class MyProjectNameMenuContributor : IMenuContributor
{ {
public class MyProjectNameMenuContributor : IMenuContributor public async Task ConfigureMenuAsync(MenuConfigurationContext context)
{ {
public async Task ConfigureMenuAsync(MenuConfigurationContext context) if (context.Menu.Name == StandardMenus.Main)
{ {
if (context.Menu.Name == StandardMenus.Main) await ConfigureMainMenuAsync(context);
{
await ConfigureMainMenuAsync(context);
}
} }
}
private Task ConfigureMainMenuAsync(MenuConfigurationContext context) private Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{ {
var administration = context.Menu.GetAdministration(); var administration = context.Menu.GetAdministration();
if (MultiTenancyConsts.IsEnabled) if (MultiTenancyConsts.IsEnabled)
{ {
administration.SetSubItemOrder(TenantManagementMenuNames.GroupName, 1); administration.SetSubItemOrder(TenantManagementMenuNames.GroupName, 1);
} }
else else
{ {
administration.TryRemoveMenuItem(TenantManagementMenuNames.GroupName); administration.TryRemoveMenuItem(TenantManagementMenuNames.GroupName);
} }
administration.SetSubItemOrder(IdentityMenuNames.GroupName, 2); administration.SetSubItemOrder(IdentityMenuNames.GroupName, 2);
administration.SetSubItemOrder(SettingManagementMenus.GroupName, 3); administration.SetSubItemOrder(SettingManagementMenus.GroupName, 3);
return Task.CompletedTask; return Task.CompletedTask;
}
} }
} }

11
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Menus/MyProjectNameMenus.cs

@ -1,10 +1,9 @@
namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Menus namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Menus;
public class MyProjectNameMenus
{ {
public class MyProjectNameMenus private const string Prefix = "MyProjectName";
{
private const string Prefix = "MyProjectName";
//Add your menu items here... //Add your menu items here...
}
} }

1391
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20211105130007_Initial.cs

File diff suppressed because it is too large

333
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBlazorHostModule.cs

@ -50,208 +50,207 @@ using Volo.Abp.Threading;
using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace MyCompanyName.MyProjectName.Blazor.Server.Host namespace MyCompanyName.MyProjectName.Blazor.Server.Host;
[DependsOn(
typeof(MyProjectNameEntityFrameworkCoreModule),
typeof(MyProjectNameApplicationModule),
typeof(MyProjectNameHttpApiModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAutofacModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpAccountWebIdentityServerModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAspNetCoreComponentsServerBasicThemeModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpIdentityBlazorServerModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpTenantManagementBlazorServerModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpSettingManagementBlazorServerModule),
typeof(AbpSettingManagementApplicationModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(MyProjectNameBlazorServerModule)
)]
public class MyProjectNameBlazorHostModule : AbpModule
{ {
[DependsOn( public override void PreConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameEntityFrameworkCoreModule),
typeof(MyProjectNameApplicationModule),
typeof(MyProjectNameHttpApiModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAutofacModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpAccountWebIdentityServerModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAspNetCoreComponentsServerBasicThemeModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpIdentityBlazorServerModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpTenantManagementBlazorServerModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpSettingManagementBlazorServerModule),
typeof(AbpSettingManagementApplicationModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(MyProjectNameBlazorServerModule)
)]
public class MyProjectNameBlazorHostModule: AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context) context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{ {
context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options => options.AddAssemblyResource(
{ typeof(MyProjectNameResource),
options.AddAssemblyResource( typeof(MyProjectNameDomainModule).Assembly,
typeof(MyProjectNameResource), typeof(MyProjectNameDomainSharedModule).Assembly,
typeof(MyProjectNameDomainModule).Assembly, typeof(MyProjectNameApplicationModule).Assembly,
typeof(MyProjectNameDomainSharedModule).Assembly, typeof(MyProjectNameApplicationContractsModule).Assembly,
typeof(MyProjectNameApplicationModule).Assembly, typeof(MyProjectNameBlazorHostModule).Assembly
typeof(MyProjectNameApplicationContractsModule).Assembly, );
typeof(MyProjectNameBlazorHostModule).Assembly });
); }
});
}
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var hostingEnvironment = context.Services.GetHostingEnvironment(); var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration(); var configuration = context.Services.GetConfiguration();
Configure<AbpDbContextOptions>(options => Configure<AbpDbContextOptions>(options =>
{ {
options.UseSqlServer(); options.UseSqlServer();
}); });
Configure<AbpBundlingOptions>(options => Configure<AbpBundlingOptions>(options =>
{ {
// MVC UI // MVC UI
options.StyleBundles.Configure( options.StyleBundles.Configure(
BasicThemeBundles.Styles.Global, BasicThemeBundles.Styles.Global,
bundle => bundle =>
{ {
bundle.AddFiles("/global-styles.css"); bundle.AddFiles("/global-styles.css");
} }
); );
//BLAZOR UI //BLAZOR UI
options.StyleBundles.Configure( options.StyleBundles.Configure(
BlazorBasicThemeBundles.Styles.Global, BlazorBasicThemeBundles.Styles.Global,
bundle => bundle =>
{ {
bundle.AddFiles("/blazor-global-styles.css"); bundle.AddFiles("/blazor-global-styles.css");
//You can remove the following line if you don't use Blazor CSS isolation for components //You can remove the following line if you don't use Blazor CSS isolation for components
bundle.AddFiles("/MyCompanyName.MyProjectName.Blazor.Server.Host.styles.css"); bundle.AddFiles("/MyCompanyName.MyProjectName.Blazor.Server.Host.styles.css");
} }
); );
}); });
context.Services.AddAuthentication()
.AddJwtBearer(options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]);
options.Audience = "MyProjectName";
});
if(hostingEnvironment.IsDevelopment()) context.Services.AddAuthentication()
.AddJwtBearer(options =>
{ {
Configure<AbpVirtualFileSystemOptions>(options => options.Authority = configuration["AuthServer:Authority"];
{ options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]);
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain.Shared", Path.DirectorySeparatorChar))); options.Audience = "MyProjectName";
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar))); });
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameBlazorHostModule>(hostingEnvironment.ContentRootPath);
});
}
context.Services.AddAbpSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
Configure<AbpLocalizationOptions>(options => if (hostingEnvironment.IsDevelopment())
{
Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية")); options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain.Shared", Path.DirectorySeparatorChar)));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar)));
options.Languages.Add(new LanguageInfo("en", "en", "English")); options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar)));
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)")); options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application", Path.DirectorySeparatorChar)));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish")); options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameBlazorHostModule>(hostingEnvironment.ContentRootPath);
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("it", "it", "Italian", "it"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português (Brasil)"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
}); });
}
Configure<AbpMultiTenancyOptions>(options => context.Services.AddAbpSwaggerGen(
options =>
{ {
options.IsEnabled = MultiTenancyConsts.IsEnabled; options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
}); });
context.Services Configure<AbpLocalizationOptions>(options =>
.AddBootstrap5Providers() {
.AddFontAwesomeIcons(); options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("it", "it", "Italian", "it"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português (Brasil)"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
});
Configure<AbpNavigationOptions>(options => Configure<AbpMultiTenancyOptions>(options =>
{ {
options.MenuContributors.Add(new MyProjectNameMenuContributor()); options.IsEnabled = MultiTenancyConsts.IsEnabled;
}); });
Configure<AbpRouterOptions>(options => context.Services
{ .AddBootstrap5Providers()
options.AppAssembly = typeof(MyProjectNameBlazorHostModule).Assembly; .AddFontAwesomeIcons();
});
Configure<AbpNavigationOptions>(options =>
{
options.MenuContributors.Add(new MyProjectNameMenuContributor());
});
Configure<AbpRouterOptions>(options =>
{
options.AppAssembly = typeof(MyProjectNameBlazorHostModule).Assembly;
});
#if DEBUG #if DEBUG
context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>()); context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
#endif #endif
} }
public override void OnApplicationInitialization(ApplicationInitializationContext context) public override void OnApplicationInitialization(ApplicationInitializationContext context)
{ {
var env = context.GetEnvironment(); var env = context.GetEnvironment();
var app = context.GetApplicationBuilder(); var app = context.GetApplicationBuilder();
app.UseAbpRequestLocalization(); app.UseAbpRequestLocalization();
if (env.IsDevelopment()) if (env.IsDevelopment())
{ {
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
} }
else else
{ {
app.UseExceptionHandler("/Error"); app.UseExceptionHandler("/Error");
app.UseHsts(); app.UseHsts();
} }
app.UseHttpsRedirection(); app.UseHttpsRedirection();
app.UseCorrelationId(); app.UseCorrelationId();
app.UseStaticFiles(); app.UseStaticFiles();
app.UseRouting(); app.UseRouting();
app.UseAuthentication(); app.UseAuthentication();
app.UseJwtTokenMiddleware(); app.UseJwtTokenMiddleware();
if (MultiTenancyConsts.IsEnabled) if (MultiTenancyConsts.IsEnabled)
{ {
app.UseMultiTenancy(); app.UseMultiTenancy();
} }
app.UseUnitOfWork(); app.UseUnitOfWork();
app.UseIdentityServer(); app.UseIdentityServer();
app.UseAuthorization(); app.UseAuthorization();
app.UseSwagger(); app.UseSwagger();
app.UseAbpSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API");
}); });
app.UseConfiguredEndpoints(); app.UseConfiguredEndpoints();
using (var scope = context.ServiceProvider.CreateScope()) using (var scope = context.ServiceProvider.CreateScope())
{
AsyncHelper.RunSync(async () =>
{ {
AsyncHelper.RunSync(async () => await scope.ServiceProvider
{ .GetRequiredService<IDataSeeder>()
await scope.ServiceProvider .SeedAsync();
.GetRequiredService<IDataSeeder>() });
.SeedAsync();
});
}
} }
} }
} }

11
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameBrandingProvider.cs

@ -1,11 +1,10 @@
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Ui.Branding; using Volo.Abp.Ui.Branding;
namespace MyCompanyName.MyProjectName.Blazor.Server.Host namespace MyCompanyName.MyProjectName.Blazor.Server.Host;
[Dependency(ReplaceServices = true)]
public class MyProjectNameBrandingProvider : DefaultBrandingProvider
{ {
[Dependency(ReplaceServices = true)] public override string AppName => "MyProjectName";
public class MyProjectNameBrandingProvider : DefaultBrandingProvider
{
public override string AppName => "MyProjectName";
}
} }

11
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyProjectNameComponentBase.cs

@ -1,13 +1,12 @@
using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Localization;
using Volo.Abp.AspNetCore.Components; using Volo.Abp.AspNetCore.Components;
namespace MyCompanyName.MyProjectName.Blazor.Server.Host namespace MyCompanyName.MyProjectName.Blazor.Server.Host;
public abstract class MyProjectNameComponentBase : AbpComponentBase
{ {
public abstract class MyProjectNameComponentBase : AbpComponentBase protected MyProjectNameComponentBase()
{ {
protected MyProjectNameComponentBase() LocalizationResource = typeof(MyProjectNameResource);
{
LocalizationResource = typeof(MyProjectNameResource);
}
} }
} }

7
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Pages/Index.razor.cs

@ -1,6 +1,5 @@
namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Pages namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Pages;
public partial class Index
{ {
public partial class Index
{
}
} }

65
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Program.cs

@ -5,53 +5,52 @@ using Microsoft.Extensions.Hosting;
using Serilog; using Serilog;
using Serilog.Events; using Serilog.Events;
namespace MyCompanyName.MyProjectName.Blazor.Server.Host namespace MyCompanyName.MyProjectName.Blazor.Server.Host;
public class Program
{ {
public class Program public static int Main(string[] args)
{ {
public static int Main(string[] args) Log.Logger = new LoggerConfiguration()
{
Log.Logger = new LoggerConfiguration()
#if DEBUG #if DEBUG
.MinimumLevel.Debug() .MinimumLevel.Debug()
#else #else
.MinimumLevel.Information() .MinimumLevel.Information()
#endif #endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
.Enrich.FromLogContext() .Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.File("Logs/logs.txt"))
#if DEBUG #if DEBUG
.WriteTo.Async(c => c.Console()) .WriteTo.Async(c => c.Console())
#endif #endif
.CreateLogger(); .CreateLogger();
try try
{ {
Log.Information("Starting web host."); Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run(); CreateHostBuilder(args).Build().Run();
return 0; return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
} }
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) => public static IHostBuilder CreateHostBuilder(string[] args) =>
Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args) Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson() .AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder => .ConfigureWebHostDefaults(webBuilder =>
{ {
webBuilder.UseStartup<Startup>(); webBuilder.UseStartup<Startup>();
}) })
.UseAutofac() .UseAutofac()
.UseSerilog(); .UseSerilog();
}
} }

19
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Startup.cs

@ -2,18 +2,17 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace MyCompanyName.MyProjectName.Blazor.Server.Host namespace MyCompanyName.MyProjectName.Blazor.Server.Host;
public class Startup
{ {
public class Startup public void ConfigureServices(IServiceCollection services)
{ {
public void ConfigureServices(IServiceCollection services) services.AddApplication<MyProjectNameBlazorHostModule>();
{ }
services.AddApplication<MyProjectNameBlazorHostModule>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ {
app.InitializeApplication(); app.InitializeApplication();
}
} }
} }

15
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Host.Shared/MultiTenancy/MultiTenancyConsts.cs

@ -1,10 +1,9 @@
namespace MyCompanyName.MyProjectName.MultiTenancy namespace MyCompanyName.MyProjectName.MultiTenancy;
public static class MultiTenancyConsts
{ {
public static class MultiTenancyConsts /* Enable/disable multi-tenancy in a single point
{ * to test your module with multi-tenancy.
/* Enable/disable multi-tenancy in a single point */
* to test your module with multi-tenancy. public const bool IsEnabled = false;
*/
public const bool IsEnabled = false;
}
} }

11
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Controllers/HomeController.cs

@ -1,13 +1,12 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc;
namespace MyCompanyName.MyProjectName.Controllers namespace MyCompanyName.MyProjectName.Controllers;
public class HomeController : AbpController
{ {
public class HomeController : AbpController public ActionResult Index()
{ {
public ActionResult Index() return Redirect("~/swagger");
{
return Redirect("~/swagger");
}
} }
} }

21
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/EntityFrameworkCore/MyProjectNameHttpApiHostMigrationsDbContext.cs

@ -1,21 +1,20 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
public class MyProjectNameHttpApiHostMigrationsDbContext : AbpDbContext<MyProjectNameHttpApiHostMigrationsDbContext>
{ {
public class MyProjectNameHttpApiHostMigrationsDbContext : AbpDbContext<MyProjectNameHttpApiHostMigrationsDbContext> public MyProjectNameHttpApiHostMigrationsDbContext(DbContextOptions<MyProjectNameHttpApiHostMigrationsDbContext> options)
: base(options)
{ {
public MyProjectNameHttpApiHostMigrationsDbContext(DbContextOptions<MyProjectNameHttpApiHostMigrationsDbContext> options)
: base(options)
{
} }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
modelBuilder.ConfigureMyProjectName(); modelBuilder.ConfigureMyProjectName();
}
} }
} }

31
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/EntityFrameworkCore/MyProjectNameHttpApiHostMigrationsDbContextFactory.cs

@ -3,27 +3,26 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
public class MyProjectNameHttpApiHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<MyProjectNameHttpApiHostMigrationsDbContext>
{ {
public class MyProjectNameHttpApiHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<MyProjectNameHttpApiHostMigrationsDbContext> public MyProjectNameHttpApiHostMigrationsDbContext CreateDbContext(string[] args)
{ {
public MyProjectNameHttpApiHostMigrationsDbContext CreateDbContext(string[] args) var configuration = BuildConfiguration();
{
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<MyProjectNameHttpApiHostMigrationsDbContext>() var builder = new DbContextOptionsBuilder<MyProjectNameHttpApiHostMigrationsDbContext>()
.UseSqlServer(configuration.GetConnectionString("MyProjectName")); .UseSqlServer(configuration.GetConnectionString("MyProjectName"));
return new MyProjectNameHttpApiHostMigrationsDbContext(builder.Options); return new MyProjectNameHttpApiHostMigrationsDbContext(builder.Options);
} }
private static IConfigurationRoot BuildConfiguration() private static IConfigurationRoot BuildConfiguration()
{ {
var builder = new ConfigurationBuilder() var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory()) .SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false); .AddJsonFile("appsettings.json", optional: false);
return builder.Build(); return builder.Build();
}
} }
} }

271
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs

@ -33,166 +33,165 @@ using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.Swashbuckle; using Volo.Abp.Swashbuckle;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(MyProjectNameApplicationModule),
typeof(MyProjectNameEntityFrameworkCoreModule),
typeof(MyProjectNameHttpApiModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule)
)]
public class MyProjectNameHttpApiHostModule : AbpModule
{ {
[DependsOn(
typeof(MyProjectNameApplicationModule), public override void ConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameEntityFrameworkCoreModule),
typeof(MyProjectNameHttpApiModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule)
)]
public class MyProjectNameHttpApiHostModule : AbpModule
{ {
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
public override void ConfigureServices(ServiceConfigurationContext context) Configure<AbpDbContextOptions>(options =>
{ {
var hostingEnvironment = context.Services.GetHostingEnvironment(); options.UseSqlServer();
var configuration = context.Services.GetConfiguration(); });
Configure<AbpDbContextOptions>(options => Configure<AbpMultiTenancyOptions>(options =>
{ {
options.UseSqlServer(); options.IsEnabled = MultiTenancyConsts.IsEnabled;
}); });
Configure<AbpMultiTenancyOptions>(options => if (hostingEnvironment.IsDevelopment())
{
Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.IsEnabled = MultiTenancyConsts.IsEnabled; options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application", Path.DirectorySeparatorChar)));
}); });
}
if (hostingEnvironment.IsDevelopment()) context.Services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{ {
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application", Path.DirectorySeparatorChar)));
});
}
context.Services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{"MyProjectName", "MyProjectName API"} {"MyProjectName", "MyProjectName API"}
}, },
options => options =>
{
options.SwaggerDoc("v1", new OpenApiInfo {Title = "MyProjectName API", Version = "v1"});
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
Configure<AbpLocalizationOptions>(options =>
{ {
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية")); options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); options.DocInclusionPredicate((docName, description) => true);
options.Languages.Add(new LanguageInfo("en", "en", "English")); options.CustomSchemaIds(type => type.FullName);
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
}); });
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) Configure<AbpLocalizationOptions>(options =>
.AddJwtBearer(options => {
{ options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Authority = configuration["AuthServer:Authority"]; options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Audience = "MyProjectName"; options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
}); options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
});
Configure<AbpDistributedCacheOptions>(options => context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{ {
options.KeyPrefix = "MyProjectName:"; options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]);
options.Audience = "MyProjectName";
}); });
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("MyProjectName"); Configure<AbpDistributedCacheOptions>(options =>
if (!hostingEnvironment.IsDevelopment()) {
{ options.KeyPrefix = "MyProjectName:";
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); });
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys");
}
context.Services.AddCors(options => var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("MyProjectName");
{ if (!hostingEnvironment.IsDevelopment())
options.AddDefaultPolicy(builder => {
{ var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
builder dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys");
.WithOrigins(
configuration["App:CorsOrigins"]
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
} }
public override void OnApplicationInitialization(ApplicationInitializationContext context) context.Services.AddCors(options =>
{ {
var app = context.GetApplicationBuilder(); options.AddDefaultPolicy(builder =>
var env = context.GetEnvironment();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{ {
app.UseHsts(); builder
} .WithOrigins(
configuration["App:CorsOrigins"]
app.UseHttpsRedirection(); .Split(",", StringSplitOptions.RemoveEmptyEntries)
app.UseCorrelationId(); .Select(o => o.RemovePostFix("/"))
app.UseStaticFiles(); .ToArray()
app.UseRouting(); )
app.UseCors(); .WithAbpExposedHeaders()
app.UseAuthentication(); .SetIsOriginAllowedToAllowWildcardSubdomains()
if (MultiTenancyConsts.IsEnabled) .AllowAnyHeader()
{ .AllowAnyMethod()
app.UseMultiTenancy(); .AllowCredentials();
}
app.UseAbpRequestLocalization();
app.UseAuthorization();
app.UseSwagger();
app.UseAbpSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);
options.OAuthScopes("MyProjectName");
}); });
app.UseAuditing(); });
app.UseAbpSerilogEnrichers(); }
app.UseConfiguredEndpoints();
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} }
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseCorrelationId();
app.UseStaticFiles();
app.UseRouting();
app.UseCors();
app.UseAuthentication();
if (MultiTenancyConsts.IsEnabled)
{
app.UseMultiTenancy();
}
app.UseAbpRequestLocalization();
app.UseAuthorization();
app.UseSwagger();
app.UseAbpSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);
options.OAuthScopes("MyProjectName");
});
app.UseAuditing();
app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints();
} }
} }

63
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Program.cs

@ -6,51 +6,50 @@ using Microsoft.Extensions.Hosting;
using Serilog; using Serilog;
using Serilog.Events; using Serilog.Events;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class Program
{ {
public class Program public static int Main(string[] args)
{ {
public static int Main(string[] args) Log.Logger = new LoggerConfiguration()
{
Log.Logger = new LoggerConfiguration()
#if DEBUG #if DEBUG
.MinimumLevel.Debug() .MinimumLevel.Debug()
#else #else
.MinimumLevel.Information() .MinimumLevel.Information()
#endif #endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext() .Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.File("Logs/logs.txt"))
#if DEBUG #if DEBUG
.WriteTo.Async(c => c.Console()) .WriteTo.Async(c => c.Console())
#endif #endif
.CreateLogger(); .CreateLogger();
try try
{ {
Log.Information("Starting web host."); Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run(); CreateHostBuilder(args).Build().Run();
return 0; return 0;
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Fatal(ex, "Host terminated unexpectedly!"); Log.Fatal(ex, "Host terminated unexpectedly!");
return 1; return 1;
} }
finally finally
{ {
Log.CloseAndFlush(); Log.CloseAndFlush();
}
} }
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
} }
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
} }

19
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/Startup.cs

@ -4,18 +4,17 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class Startup
{ {
public class Startup public void ConfigureServices(IServiceCollection services)
{ {
public void ConfigureServices(IServiceCollection services) services.AddApplication<MyProjectNameHttpApiHostModule>();
{ }
services.AddApplication<MyProjectNameHttpApiHostModule>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{ {
app.InitializeApplication(); app.InitializeApplication();
}
} }
} }

33
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/EntityFrameworkCore/IdentityServerHostMigrationsDbContext.cs

@ -8,27 +8,26 @@ using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.TenantManagement.EntityFrameworkCore; using Volo.Abp.TenantManagement.EntityFrameworkCore;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
public class IdentityServerHostMigrationsDbContext : AbpDbContext<IdentityServerHostMigrationsDbContext>
{ {
public class IdentityServerHostMigrationsDbContext : AbpDbContext<IdentityServerHostMigrationsDbContext> public IdentityServerHostMigrationsDbContext(DbContextOptions<IdentityServerHostMigrationsDbContext> options)
: base(options)
{ {
public IdentityServerHostMigrationsDbContext(DbContextOptions<IdentityServerHostMigrationsDbContext> options)
: base(options)
{
} }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
modelBuilder.ConfigurePermissionManagement(); modelBuilder.ConfigurePermissionManagement();
modelBuilder.ConfigureSettingManagement(); modelBuilder.ConfigureSettingManagement();
modelBuilder.ConfigureAuditLogging(); modelBuilder.ConfigureAuditLogging();
modelBuilder.ConfigureIdentity(); modelBuilder.ConfigureIdentity();
modelBuilder.ConfigureIdentityServer(); modelBuilder.ConfigureIdentityServer();
modelBuilder.ConfigureFeatureManagement(); modelBuilder.ConfigureFeatureManagement();
modelBuilder.ConfigureTenantManagement(); modelBuilder.ConfigureTenantManagement();
}
} }
} }

31
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/EntityFrameworkCore/IdentityServerHostMigrationsDbContextFactory.cs

@ -3,27 +3,26 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
public class IdentityServerHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<IdentityServerHostMigrationsDbContext>
{ {
public class IdentityServerHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<IdentityServerHostMigrationsDbContext> public IdentityServerHostMigrationsDbContext CreateDbContext(string[] args)
{ {
public IdentityServerHostMigrationsDbContext CreateDbContext(string[] args) var configuration = BuildConfiguration();
{
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<IdentityServerHostMigrationsDbContext>() var builder = new DbContextOptionsBuilder<IdentityServerHostMigrationsDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default")); .UseSqlServer(configuration.GetConnectionString("Default"));
return new IdentityServerHostMigrationsDbContext(builder.Options); return new IdentityServerHostMigrationsDbContext(builder.Options);
} }
private static IConfigurationRoot BuildConfiguration() private static IConfigurationRoot BuildConfiguration()
{ {
var builder = new ConfigurationBuilder() var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory()) .SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false); .AddJsonFile("appsettings.json", optional: false);
return builder.Build(); return builder.Build();
}
} }
} }

469
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/IdentityServer/IdentityServerDataSeedContributor.cs

@ -18,60 +18,60 @@ using ApiResource = Volo.Abp.IdentityServer.ApiResources.ApiResource;
using ApiScope = Volo.Abp.IdentityServer.ApiScopes.ApiScope; using ApiScope = Volo.Abp.IdentityServer.ApiScopes.ApiScope;
using Client = Volo.Abp.IdentityServer.Clients.Client; using Client = Volo.Abp.IdentityServer.Clients.Client;
namespace MyCompanyName.MyProjectName.IdentityServer namespace MyCompanyName.MyProjectName.IdentityServer;
public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency
{ {
public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency private readonly IApiResourceRepository _apiResourceRepository;
private readonly IApiScopeRepository _apiScopeRepository;
private readonly IClientRepository _clientRepository;
private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder;
private readonly IGuidGenerator _guidGenerator;
private readonly IPermissionDataSeeder _permissionDataSeeder;
private readonly IConfiguration _configuration;
private readonly ICurrentTenant _currentTenant;
public IdentityServerDataSeedContributor(
IClientRepository clientRepository,
IApiResourceRepository apiResourceRepository,
IApiScopeRepository apiScopeRepository,
IIdentityResourceDataSeeder identityResourceDataSeeder,
IGuidGenerator guidGenerator,
IPermissionDataSeeder permissionDataSeeder,
IConfiguration configuration,
ICurrentTenant currentTenant)
{ {
private readonly IApiResourceRepository _apiResourceRepository; _clientRepository = clientRepository;
private readonly IApiScopeRepository _apiScopeRepository; _apiResourceRepository = apiResourceRepository;
private readonly IClientRepository _clientRepository; _apiScopeRepository = apiScopeRepository;
private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder; _identityResourceDataSeeder = identityResourceDataSeeder;
private readonly IGuidGenerator _guidGenerator; _guidGenerator = guidGenerator;
private readonly IPermissionDataSeeder _permissionDataSeeder; _permissionDataSeeder = permissionDataSeeder;
private readonly IConfiguration _configuration; _configuration = configuration;
private readonly ICurrentTenant _currentTenant; _currentTenant = currentTenant;
}
public IdentityServerDataSeedContributor(
IClientRepository clientRepository,
IApiResourceRepository apiResourceRepository,
IApiScopeRepository apiScopeRepository,
IIdentityResourceDataSeeder identityResourceDataSeeder,
IGuidGenerator guidGenerator,
IPermissionDataSeeder permissionDataSeeder,
IConfiguration configuration,
ICurrentTenant currentTenant)
{
_clientRepository = clientRepository;
_apiResourceRepository = apiResourceRepository;
_apiScopeRepository = apiScopeRepository;
_identityResourceDataSeeder = identityResourceDataSeeder;
_guidGenerator = guidGenerator;
_permissionDataSeeder = permissionDataSeeder;
_configuration = configuration;
_currentTenant = currentTenant;
}
[UnitOfWork] [UnitOfWork]
public virtual async Task SeedAsync(DataSeedContext context) public virtual async Task SeedAsync(DataSeedContext context)
{
using (_currentTenant.Change(context?.TenantId))
{ {
using (_currentTenant.Change(context?.TenantId)) await _identityResourceDataSeeder.CreateStandardResourcesAsync();
{ await CreateApiResourcesAsync();
await _identityResourceDataSeeder.CreateStandardResourcesAsync(); await CreateApiScopesAsync();
await CreateApiResourcesAsync(); await CreateClientsAsync();
await CreateApiScopesAsync();
await CreateClientsAsync();
}
} }
}
private async Task CreateApiScopesAsync() private async Task CreateApiScopesAsync()
{ {
await CreateApiScopeAsync("MyProjectName"); await CreateApiScopeAsync("MyProjectName");
} }
private async Task CreateApiResourcesAsync() private async Task CreateApiResourcesAsync()
{
var commonApiUserClaims = new[]
{ {
var commonApiUserClaims = new[]
{
"email", "email",
"email_verified", "email_verified",
"name", "name",
@ -80,57 +80,57 @@ namespace MyCompanyName.MyProjectName.IdentityServer
"role" "role"
}; };
await CreateApiResourceAsync("MyProjectName", commonApiUserClaims); await CreateApiResourceAsync("MyProjectName", commonApiUserClaims);
} }
private async Task<ApiResource> CreateApiResourceAsync(string name, IEnumerable<string> claims) private async Task<ApiResource> CreateApiResourceAsync(string name, IEnumerable<string> claims)
{
var apiResource = await _apiResourceRepository.FindByNameAsync(name);
if (apiResource == null)
{ {
var apiResource = await _apiResourceRepository.FindByNameAsync(name); apiResource = await _apiResourceRepository.InsertAsync(
if (apiResource == null) new ApiResource(
{ _guidGenerator.Create(),
apiResource = await _apiResourceRepository.InsertAsync( name,
new ApiResource( name + " API"
_guidGenerator.Create(), ),
name, autoSave: true
name + " API" );
),
autoSave: true
);
}
foreach (var claim in claims)
{
if (apiResource.FindClaim(claim) == null)
{
apiResource.AddUserClaim(claim);
}
}
return await _apiResourceRepository.UpdateAsync(apiResource);
} }
private async Task<ApiScope> CreateApiScopeAsync(string name) foreach (var claim in claims)
{ {
var apiScope = await _apiScopeRepository.FindByNameAsync(name); if (apiResource.FindClaim(claim) == null)
if (apiScope == null)
{ {
apiScope = await _apiScopeRepository.InsertAsync( apiResource.AddUserClaim(claim);
new ApiScope(
_guidGenerator.Create(),
name,
name + " API"
),
autoSave: true
);
} }
}
return await _apiResourceRepository.UpdateAsync(apiResource);
}
return apiScope; private async Task<ApiScope> CreateApiScopeAsync(string name)
{
var apiScope = await _apiScopeRepository.FindByNameAsync(name);
if (apiScope == null)
{
apiScope = await _apiScopeRepository.InsertAsync(
new ApiScope(
_guidGenerator.Create(),
name,
name + " API"
),
autoSave: true
);
} }
private async Task CreateClientsAsync() return apiScope;
}
private async Task CreateClientsAsync()
{
var commonScopes = new[]
{ {
var commonScopes = new[]
{
"email", "email",
"openid", "openid",
"profile", "profile",
@ -140,185 +140,184 @@ namespace MyCompanyName.MyProjectName.IdentityServer
"MyProjectName" "MyProjectName"
}; };
var configurationSection = _configuration.GetSection("IdentityServer:Clients"); var configurationSection = _configuration.GetSection("IdentityServer:Clients");
//Web Client //Web Client
var webClientId = configurationSection["MyProjectName_Web:ClientId"]; var webClientId = configurationSection["MyProjectName_Web:ClientId"];
if (!webClientId.IsNullOrWhiteSpace()) if (!webClientId.IsNullOrWhiteSpace())
{ {
var webClientRootUrl = configurationSection["MyProjectName_Web:RootUrl"].EnsureEndsWith('/'); var webClientRootUrl = configurationSection["MyProjectName_Web:RootUrl"].EnsureEndsWith('/');
/* MyProjectName_Web client is only needed if you created a tiered
* solution. Otherwise, you can delete this client. */
await CreateClientAsync(
name: webClientId,
scopes: commonScopes,
grantTypes: new[] { "hybrid" },
secret: (configurationSection["MyProjectName_Web:ClientSecret"] ?? "1q2w3e*").Sha256(),
redirectUri: $"{webClientRootUrl}signin-oidc",
postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc",
frontChannelLogoutUri: $"{webClientRootUrl}Account/FrontChannelLogout",
corsOrigins: new[] { webClientRootUrl.RemovePostFix("/") }
);
}
//Console Test / Angular Client /* MyProjectName_Web client is only needed if you created a tiered
var consoleAndAngularClientId = configurationSection["MyProjectName_App:ClientId"]; * solution. Otherwise, you can delete this client. */
if (!consoleAndAngularClientId.IsNullOrWhiteSpace())
{
var webClientRootUrl = configurationSection["MyProjectName_App:RootUrl"]?.TrimEnd('/');
await CreateClientAsync(
name: consoleAndAngularClientId,
scopes: commonScopes,
grantTypes: new[] { "password", "client_credentials", "authorization_code" },
secret: (configurationSection["MyProjectName_App:ClientSecret"] ?? "1q2w3e*").Sha256(),
requireClientSecret: false,
redirectUri: webClientRootUrl,
postLogoutRedirectUri: webClientRootUrl,
corsOrigins: new[] { webClientRootUrl.RemovePostFix("/") }
);
}
// Blazor Client await CreateClientAsync(
var blazorClientId = configurationSection["MyProjectName_Blazor:ClientId"]; name: webClientId,
if (!blazorClientId.IsNullOrWhiteSpace()) scopes: commonScopes,
{ grantTypes: new[] { "hybrid" },
var blazorRootUrl = configurationSection["MyProjectName_Blazor:RootUrl"].TrimEnd('/'); secret: (configurationSection["MyProjectName_Web:ClientSecret"] ?? "1q2w3e*").Sha256(),
redirectUri: $"{webClientRootUrl}signin-oidc",
await CreateClientAsync( postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc",
name: blazorClientId, frontChannelLogoutUri: $"{webClientRootUrl}Account/FrontChannelLogout",
scopes: commonScopes, corsOrigins: new[] { webClientRootUrl.RemovePostFix("/") }
grantTypes: new[] { "authorization_code" }, );
secret: configurationSection["MyProjectName_Blazor:ClientSecret"]?.Sha256(), }
requireClientSecret: false,
redirectUri: $"{blazorRootUrl}/authentication/login-callback",
postLogoutRedirectUri: $"{blazorRootUrl}/authentication/logout-callback",
corsOrigins: new[] { blazorRootUrl.RemovePostFix("/") }
);
}
// Swagger Client //Console Test / Angular Client
var swaggerClientId = configurationSection["MyProjectName_Swagger:ClientId"]; var consoleAndAngularClientId = configurationSection["MyProjectName_App:ClientId"];
if (!swaggerClientId.IsNullOrWhiteSpace()) if (!consoleAndAngularClientId.IsNullOrWhiteSpace())
{ {
var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"].TrimEnd('/'); var webClientRootUrl = configurationSection["MyProjectName_App:RootUrl"]?.TrimEnd('/');
await CreateClientAsync( await CreateClientAsync(
name: swaggerClientId, name: consoleAndAngularClientId,
scopes: commonScopes, scopes: commonScopes,
grantTypes: new[] { "authorization_code" }, grantTypes: new[] { "password", "client_credentials", "authorization_code" },
secret: configurationSection["MyProjectName_Swagger:ClientSecret"]?.Sha256(), secret: (configurationSection["MyProjectName_App:ClientSecret"] ?? "1q2w3e*").Sha256(),
requireClientSecret: false, requireClientSecret: false,
redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html", redirectUri: webClientRootUrl,
corsOrigins: new[] { swaggerRootUrl.RemovePostFix("/") } postLogoutRedirectUri: webClientRootUrl,
); corsOrigins: new[] { webClientRootUrl.RemovePostFix("/") }
} );
} }
private async Task<Client> CreateClientAsync( // Blazor Client
string name, var blazorClientId = configurationSection["MyProjectName_Blazor:ClientId"];
IEnumerable<string> scopes, if (!blazorClientId.IsNullOrWhiteSpace())
IEnumerable<string> grantTypes,
string secret = null,
string redirectUri = null,
string postLogoutRedirectUri = null,
string frontChannelLogoutUri = null,
bool requireClientSecret = true,
bool requirePkce = false,
IEnumerable<string> permissions = null,
IEnumerable<string> corsOrigins = null)
{ {
var client = await _clientRepository.FindByClientIdAsync(name); var blazorRootUrl = configurationSection["MyProjectName_Blazor:RootUrl"].TrimEnd('/');
if (client == null)
{ await CreateClientAsync(
client = await _clientRepository.InsertAsync( name: blazorClientId,
new Client( scopes: commonScopes,
_guidGenerator.Create(), grantTypes: new[] { "authorization_code" },
name secret: configurationSection["MyProjectName_Blazor:ClientSecret"]?.Sha256(),
) requireClientSecret: false,
{ redirectUri: $"{blazorRootUrl}/authentication/login-callback",
ClientName = name, postLogoutRedirectUri: $"{blazorRootUrl}/authentication/logout-callback",
ProtocolType = "oidc", corsOrigins: new[] { blazorRootUrl.RemovePostFix("/") }
Description = name, );
AlwaysIncludeUserClaimsInIdToken = true, }
AllowOfflineAccess = true,
AbsoluteRefreshTokenLifetime = 31536000, //365 days // Swagger Client
var swaggerClientId = configurationSection["MyProjectName_Swagger:ClientId"];
if (!swaggerClientId.IsNullOrWhiteSpace())
{
var swaggerRootUrl = configurationSection["MyProjectName_Swagger:RootUrl"].TrimEnd('/');
await CreateClientAsync(
name: swaggerClientId,
scopes: commonScopes,
grantTypes: new[] { "authorization_code" },
secret: configurationSection["MyProjectName_Swagger:ClientSecret"]?.Sha256(),
requireClientSecret: false,
redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html",
corsOrigins: new[] { swaggerRootUrl.RemovePostFix("/") }
);
}
}
private async Task<Client> CreateClientAsync(
string name,
IEnumerable<string> scopes,
IEnumerable<string> grantTypes,
string secret = null,
string redirectUri = null,
string postLogoutRedirectUri = null,
string frontChannelLogoutUri = null,
bool requireClientSecret = true,
bool requirePkce = false,
IEnumerable<string> permissions = null,
IEnumerable<string> corsOrigins = null)
{
var client = await _clientRepository.FindByClientIdAsync(name);
if (client == null)
{
client = await _clientRepository.InsertAsync(
new Client(
_guidGenerator.Create(),
name
)
{
ClientName = name,
ProtocolType = "oidc",
Description = name,
AlwaysIncludeUserClaimsInIdToken = true,
AllowOfflineAccess = true,
AbsoluteRefreshTokenLifetime = 31536000, //365 days
AccessTokenLifetime = 31536000, //365 days AccessTokenLifetime = 31536000, //365 days
AuthorizationCodeLifetime = 300, AuthorizationCodeLifetime = 300,
IdentityTokenLifetime = 300, IdentityTokenLifetime = 300,
RequireConsent = false, RequireConsent = false,
FrontChannelLogoutUri = frontChannelLogoutUri, FrontChannelLogoutUri = frontChannelLogoutUri,
RequireClientSecret = requireClientSecret, RequireClientSecret = requireClientSecret,
RequirePkce = requirePkce RequirePkce = requirePkce
}, },
autoSave: true autoSave: true
); );
} }
foreach (var scope in scopes) foreach (var scope in scopes)
{
if (client.FindScope(scope) == null)
{ {
if (client.FindScope(scope) == null) client.AddScope(scope);
{
client.AddScope(scope);
}
} }
}
foreach (var grantType in grantTypes) foreach (var grantType in grantTypes)
{
if (client.FindGrantType(grantType) == null)
{ {
if (client.FindGrantType(grantType) == null) client.AddGrantType(grantType);
{
client.AddGrantType(grantType);
}
} }
}
if (!secret.IsNullOrEmpty()) if (!secret.IsNullOrEmpty())
{
if (client.FindSecret(secret) == null)
{ {
if (client.FindSecret(secret) == null) client.AddSecret(secret);
{
client.AddSecret(secret);
}
} }
}
if (redirectUri != null) if (redirectUri != null)
{
if (client.FindRedirectUri(redirectUri) == null)
{ {
if (client.FindRedirectUri(redirectUri) == null) client.AddRedirectUri(redirectUri);
{
client.AddRedirectUri(redirectUri);
}
} }
}
if (postLogoutRedirectUri != null) if (postLogoutRedirectUri != null)
{
if (client.FindPostLogoutRedirectUri(postLogoutRedirectUri) == null)
{ {
if (client.FindPostLogoutRedirectUri(postLogoutRedirectUri) == null) client.AddPostLogoutRedirectUri(postLogoutRedirectUri);
{
client.AddPostLogoutRedirectUri(postLogoutRedirectUri);
}
} }
}
if (permissions != null) if (permissions != null)
{ {
await _permissionDataSeeder.SeedAsync( await _permissionDataSeeder.SeedAsync(
ClientPermissionValueProvider.ProviderName, ClientPermissionValueProvider.ProviderName,
name, name,
permissions, permissions,
null null
); );
} }
if (corsOrigins != null) if (corsOrigins != null)
{
foreach (var origin in corsOrigins)
{ {
foreach (var origin in corsOrigins) if (!origin.IsNullOrWhiteSpace() && client.FindCorsOrigin(origin) == null)
{ {
if (!origin.IsNullOrWhiteSpace() && client.FindCorsOrigin(origin) == null) client.AddCorsOrigin(origin);
{
client.AddCorsOrigin(origin);
}
} }
} }
return await _clientRepository.UpdateAsync(client);
} }
return await _clientRepository.UpdateAsync(client);
} }
} }

2528
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Migrations/20211105130012_Initial.cs

File diff suppressed because it is too large

325
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs

@ -49,198 +49,197 @@ using Volo.Abp.TenantManagement.EntityFrameworkCore;
using Volo.Abp.Threading; using Volo.Abp.Threading;
using Volo.Abp.UI.Navigation.Urls; using Volo.Abp.UI.Navigation.Urls;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(AbpAccountWebIdentityServerModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAccountHttpApiModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityServerEntityFrameworkCoreModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpPermissionManagementHttpApiModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpSettingManagementApplicationModule),
typeof(AbpSettingManagementHttpApiModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpFeatureManagementHttpApiModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementHttpApiModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule)
)]
public class MyProjectNameIdentityServerModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(AbpAccountWebIdentityServerModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAccountHttpApiModule),
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
typeof(AbpAspNetCoreMvcModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityServerEntityFrameworkCoreModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpPermissionManagementHttpApiModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpSettingManagementApplicationModule),
typeof(AbpSettingManagementHttpApiModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpFeatureManagementHttpApiModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementHttpApiModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule)
)]
public class MyProjectNameIdentityServerModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) var hostingEnvironment = context.Services.GetHostingEnvironment();
{ var configuration = context.Services.GetConfiguration();
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
Configure<AbpDbContextOptions>(options =>
{
options.UseSqlServer();
});
context.Services.AddAbpSwaggerGen( Configure<AbpDbContextOptions>(options =>
options => {
{ options.UseSqlServer();
options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" }); });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
Configure<AbpLocalizationOptions>(options => context.Services.AddAbpSwaggerGen(
options =>
{ {
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية")); options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); options.DocInclusionPredicate((docName, description) => true);
options.Languages.Add(new LanguageInfo("en", "en", "English")); options.CustomSchemaIds(type => type.FullName);
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
}); });
Configure<AbpAuditingOptions>(options => Configure<AbpLocalizationOptions>(options =>
{ {
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
});
Configure<AbpAuditingOptions>(options =>
{
//options.IsEnabledForGetRequests = true; //options.IsEnabledForGetRequests = true;
options.ApplicationName = "AuthServer"; options.ApplicationName = "AuthServer";
}); });
Configure<AppUrlOptions>(options =>
{
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
});
context.Services.AddAuthentication() Configure<AppUrlOptions>(options =>
.AddJwtBearer(options => {
{ options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
options.Authority = configuration["AuthServer:Authority"]; });
options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]);
options.Audience = configuration["AuthServer:ApiName"];
});
Configure<AbpDistributedCacheOptions>(options => context.Services.AddAuthentication()
.AddJwtBearer(options =>
{ {
options.KeyPrefix = "MyProjectName:"; options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]);
options.Audience = configuration["AuthServer:ApiName"];
}); });
Configure<AbpMultiTenancyOptions>(options => Configure<AbpDistributedCacheOptions>(options =>
{ {
options.IsEnabled = MultiTenancyConsts.IsEnabled; options.KeyPrefix = "MyProjectName:";
}); });
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("MyProjectName"); Configure<AbpMultiTenancyOptions>(options =>
if (!hostingEnvironment.IsDevelopment()) {
{ options.IsEnabled = MultiTenancyConsts.IsEnabled;
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); });
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys");
} var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("MyProjectName");
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys");
}
context.Services.AddCors(options => context.Services.AddCors(options =>
{
options.AddDefaultPolicy(builder =>
{ {
options.AddDefaultPolicy(builder => builder
{ .WithOrigins(
builder configuration["App:CorsOrigins"]
.WithOrigins( .Split(",", StringSplitOptions.RemoveEmptyEntries)
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/")) )
.ToArray() .WithAbpExposedHeaders()
) .SetIsOriginAllowedToAllowWildcardSubdomains()
.WithAbpExposedHeaders() .AllowAnyHeader()
.SetIsOriginAllowedToAllowWildcardSubdomains() .AllowAnyMethod()
.AllowAnyHeader() .AllowCredentials();
.AllowAnyMethod()
.AllowCredentials();
});
}); });
});
#if DEBUG #if DEBUG
context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>()); context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
#endif #endif
} }
public override void OnApplicationInitialization(ApplicationInitializationContext context) public override void OnApplicationInitialization(ApplicationInitializationContext context)
{ {
var app = context.GetApplicationBuilder(); var app = context.GetApplicationBuilder();
var env = context.GetEnvironment(); var env = context.GetEnvironment();
if (env.IsDevelopment()) if (env.IsDevelopment())
{ {
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
} }
else else
{ {
app.UseErrorPage(); app.UseErrorPage();
app.UseHsts(); app.UseHsts();
} }
app.UseHttpsRedirection(); app.UseHttpsRedirection();
app.UseCorrelationId(); app.UseCorrelationId();
app.UseStaticFiles(); app.UseStaticFiles();
app.UseRouting(); app.UseRouting();
app.UseCors(); app.UseCors();
app.UseAuthentication(); app.UseAuthentication();
app.UseJwtTokenMiddleware(); app.UseJwtTokenMiddleware();
if (MultiTenancyConsts.IsEnabled) if (MultiTenancyConsts.IsEnabled)
{ {
app.UseMultiTenancy(); app.UseMultiTenancy();
} }
app.UseAbpRequestLocalization(); app.UseAbpRequestLocalization();
app.UseIdentityServer(); app.UseIdentityServer();
app.UseAuthorization(); app.UseAuthorization();
app.UseSwagger(); app.UseSwagger();
app.UseAbpSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
}); });
app.UseAuditing(); app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints(); app.UseConfiguredEndpoints();
SeedData(context); SeedData(context);
} }
private void SeedData(ApplicationInitializationContext context) private void SeedData(ApplicationInitializationContext context)
{
AsyncHelper.RunSync(async () =>
{ {
AsyncHelper.RunSync(async () => using (var scope = context.ServiceProvider.CreateScope())
{ {
using (var scope = context.ServiceProvider.CreateScope()) await scope.ServiceProvider
{ .GetRequiredService<IDataSeeder>()
await scope.ServiceProvider .SeedAsync();
.GetRequiredService<IDataSeeder>() }
.SeedAsync(); });
}
});
}
} }
} }

11
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Pages/Index.cshtml.cs

@ -1,11 +1,10 @@
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
namespace MyCompanyName.MyProjectName.Pages namespace MyCompanyName.MyProjectName.Pages;
public class IndexModel : AbpPageModel
{ {
public class IndexModel : AbpPageModel public void OnGet()
{ {
public void OnGet()
{
}
} }
} }

63
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Program.cs

@ -6,51 +6,50 @@ using Microsoft.Extensions.Hosting;
using Serilog; using Serilog;
using Serilog.Events; using Serilog.Events;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class Program
{ {
public class Program public static int Main(string[] args)
{ {
public static int Main(string[] args) Log.Logger = new LoggerConfiguration()
{
Log.Logger = new LoggerConfiguration()
#if DEBUG #if DEBUG
.MinimumLevel.Debug() .MinimumLevel.Debug()
#else #else
.MinimumLevel.Information() .MinimumLevel.Information()
#endif #endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext() .Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.File("Logs/logs.txt"))
#if DEBUG #if DEBUG
.WriteTo.Async(c => c.Console()) .WriteTo.Async(c => c.Console())
#endif #endif
.CreateLogger(); .CreateLogger();
try try
{ {
Log.Information("Starting web host."); Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run(); CreateHostBuilder(args).Build().Run();
return 0; return 0;
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Fatal(ex, "Host terminated unexpectedly!"); Log.Fatal(ex, "Host terminated unexpectedly!");
return 1; return 1;
} }
finally finally
{ {
Log.CloseAndFlush(); Log.CloseAndFlush();
}
} }
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
} }
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
} }

19
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/Startup.cs

@ -4,18 +4,17 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class Startup
{ {
public class Startup public void ConfigureServices(IServiceCollection services)
{ {
public void ConfigureServices(IServiceCollection services) services.AddApplication<MyProjectNameIdentityServerModule>();
{ }
services.AddApplication<MyProjectNameIdentityServerModule>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{ {
app.InitializeApplication(); app.InitializeApplication();
}
} }
} }

7
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Controllers/AccountController.cs

@ -1,9 +1,8 @@
using Volo.Abp.AspNetCore.Mvc.Authentication; using Volo.Abp.AspNetCore.Mvc.Authentication;
namespace MyCompanyName.MyProjectName.Controllers namespace MyCompanyName.MyProjectName.Controllers;
public class AccountController : ChallengeAccountController
{ {
public class AccountController : ChallengeAccountController
{
}
} }

11
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameBrandingProvider.cs

@ -1,11 +1,10 @@
using Volo.Abp.Ui.Branding; using Volo.Abp.Ui.Branding;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[Dependency(ReplaceServices = true)]
public class MyProjectNameBrandingProvider : DefaultBrandingProvider
{ {
[Dependency(ReplaceServices = true)] public override string AppName => "MyProjectName";
public class MyProjectNameBrandingProvider : DefaultBrandingProvider
{
public override string AppName => "MyProjectName";
}
} }

11
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebAutoMapperProfile.cs

@ -1,12 +1,11 @@
using AutoMapper; using AutoMapper;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class MyProjectNameWebAutoMapperProfile : Profile
{ {
public class MyProjectNameWebAutoMapperProfile : Profile public MyProjectNameWebAutoMapperProfile()
{ {
public MyProjectNameWebAutoMapperProfile() //Define your AutoMapper configuration here for the Web project.
{
//Define your AutoMapper configuration here for the Web project.
}
} }
} }

69
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostMenuContributor.cs

@ -9,48 +9,47 @@ using Volo.Abp.Authorization.Permissions;
using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation;
using Volo.Abp.Users; using Volo.Abp.Users;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class MyProjectNameWebHostMenuContributor : IMenuContributor
{ {
public class MyProjectNameWebHostMenuContributor : IMenuContributor private readonly IConfiguration _configuration;
public MyProjectNameWebHostMenuContributor(IConfiguration configuration)
{ {
private readonly IConfiguration _configuration; _configuration = configuration;
}
public MyProjectNameWebHostMenuContributor(IConfiguration configuration) public Task ConfigureMenuAsync(MenuConfigurationContext context)
{
if (context.Menu.Name == StandardMenus.User)
{ {
_configuration = configuration; AddLogoutItemToMenu(context);
} }
public Task ConfigureMenuAsync(MenuConfigurationContext context) return Task.CompletedTask;
{ }
if (context.Menu.Name == StandardMenus.User)
{
AddLogoutItemToMenu(context);
}
return Task.CompletedTask; private void AddLogoutItemToMenu(MenuConfigurationContext context)
} {
var l = context.GetLocalizer<MyProjectNameResource>();
private void AddLogoutItemToMenu(MenuConfigurationContext context) context.Menu.Items.Add(new ApplicationMenuItem(
{ "Account.Manage",
var l = context.GetLocalizer<MyProjectNameResource>(); l["MyAccount"],
$"{_configuration["AuthServer:Authority"].EnsureEndsWith('/')}Account/Manage",
context.Menu.Items.Add(new ApplicationMenuItem( icon: "fa fa-cog",
"Account.Manage", order: int.MaxValue - 1001,
l["MyAccount"], null,
$"{_configuration["AuthServer:Authority"].EnsureEndsWith('/')}Account/Manage", "_blank"
icon: "fa fa-cog", ).RequireAuthenticated());
order: int.MaxValue - 1001,
null, context.Menu.Items.Add(new ApplicationMenuItem(
"_blank" "Account.Logout",
).RequireAuthenticated()); l["Logout"],
"~/Account/Logout",
context.Menu.Items.Add(new ApplicationMenuItem( "fas fa-power-off",
"Account.Logout", order: int.MaxValue - 1000
l["Logout"], ).RequireAuthenticated());
"~/Account/Logout",
"fas fa-power-off",
order: int.MaxValue - 1000
).RequireAuthenticated());
}
} }
} }

337
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs

@ -50,213 +50,212 @@ using Volo.Abp.UI;
using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(MyProjectNameWebModule),
typeof(MyProjectNameHttpApiClientModule),
typeof(AbpAspNetCoreAuthenticationOpenIdConnectModule),
typeof(AbpAspNetCoreMvcClientModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpHttpClientWebModule),
typeof(AbpHttpClientIdentityModelWebModule),
typeof(AbpIdentityWebModule),
typeof(AbpIdentityHttpApiClientModule),
typeof(AbpFeatureManagementWebModule),
typeof(AbpFeatureManagementHttpApiClientModule),
typeof(AbpTenantManagementWebModule),
typeof(AbpTenantManagementHttpApiClientModule),
typeof(AbpPermissionManagementHttpApiClientModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule)
)]
public class MyProjectNameWebHostModule : AbpModule
{ {
[DependsOn( public override void PreConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameWebModule),
typeof(MyProjectNameHttpApiClientModule),
typeof(AbpAspNetCoreAuthenticationOpenIdConnectModule),
typeof(AbpAspNetCoreMvcClientModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAutofacModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpHttpClientWebModule),
typeof(AbpHttpClientIdentityModelWebModule),
typeof(AbpIdentityWebModule),
typeof(AbpIdentityHttpApiClientModule),
typeof(AbpFeatureManagementWebModule),
typeof(AbpFeatureManagementHttpApiClientModule),
typeof(AbpTenantManagementWebModule),
typeof(AbpTenantManagementHttpApiClientModule),
typeof(AbpPermissionManagementHttpApiClientModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule)
)]
public class MyProjectNameWebHostModule : AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context) context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{ {
context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options => options.AddAssemblyResource(
{ typeof(MyProjectNameResource),
options.AddAssemblyResource( typeof(MyProjectNameDomainSharedModule).Assembly,
typeof(MyProjectNameResource), typeof(MyProjectNameApplicationContractsModule).Assembly,
typeof(MyProjectNameDomainSharedModule).Assembly, typeof(MyProjectNameWebHostModule).Assembly
typeof(MyProjectNameApplicationContractsModule).Assembly, );
typeof(MyProjectNameWebHostModule).Assembly });
); }
});
}
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var hostingEnvironment = context.Services.GetHostingEnvironment(); var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration(); var configuration = context.Services.GetConfiguration();
ConfigureMenu(configuration); ConfigureMenu(configuration);
ConfigureCache(configuration); ConfigureCache(configuration);
ConfigureUrls(configuration); ConfigureUrls(configuration);
ConfigureAuthentication(context, configuration); ConfigureAuthentication(context, configuration);
ConfigureAutoMapper(); ConfigureAutoMapper();
ConfigureVirtualFileSystem(hostingEnvironment); ConfigureVirtualFileSystem(hostingEnvironment);
ConfigureSwaggerServices(context.Services); ConfigureSwaggerServices(context.Services);
ConfigureMultiTenancy(); ConfigureMultiTenancy();
ConfigureDataProtection(context, configuration, hostingEnvironment); ConfigureDataProtection(context, configuration, hostingEnvironment);
} }
private void ConfigureMenu(IConfiguration configuration) private void ConfigureMenu(IConfiguration configuration)
{
Configure<AbpNavigationOptions>(options =>
{ {
Configure<AbpNavigationOptions>(options => options.MenuContributors.Add(new MyProjectNameWebHostMenuContributor(configuration));
{ });
options.MenuContributors.Add(new MyProjectNameWebHostMenuContributor(configuration)); }
});
}
private void ConfigureCache(IConfiguration configuration) private void ConfigureCache(IConfiguration configuration)
{
Configure<AbpDistributedCacheOptions>(options =>
{ {
Configure<AbpDistributedCacheOptions>(options => options.KeyPrefix = "MyProjectName:";
{ });
options.KeyPrefix = "MyProjectName:"; }
});
}
private void ConfigureUrls(IConfiguration configuration) private void ConfigureUrls(IConfiguration configuration)
{
Configure<AppUrlOptions>(options =>
{ {
Configure<AppUrlOptions>(options => options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
{ });
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; }
});
}
private void ConfigureMultiTenancy() private void ConfigureMultiTenancy()
{
Configure<AbpMultiTenancyOptions>(options =>
{ {
Configure<AbpMultiTenancyOptions>(options => options.IsEnabled = MultiTenancyConsts.IsEnabled;
{ });
options.IsEnabled = MultiTenancyConsts.IsEnabled; }
});
}
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{ {
context.Services.AddAuthentication(options => context.Services.AddAuthentication(options =>
{ {
options.DefaultScheme = "Cookies"; options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc"; options.DefaultChallengeScheme = "oidc";
}) })
.AddCookie("Cookies", options => .AddCookie("Cookies", options =>
{ {
options.ExpireTimeSpan = TimeSpan.FromDays(365); options.ExpireTimeSpan = TimeSpan.FromDays(365);
}) })
.AddAbpOpenIdConnect("oidc", options => .AddAbpOpenIdConnect("oidc", options =>
{ {
options.Authority = configuration["AuthServer:Authority"]; options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]);
options.ResponseType = OpenIdConnectResponseType.CodeIdToken; options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.ClientId = configuration["AuthServer:ClientId"]; options.ClientId = configuration["AuthServer:ClientId"];
options.ClientSecret = configuration["AuthServer:ClientSecret"]; options.ClientSecret = configuration["AuthServer:ClientSecret"];
options.SaveTokens = true; options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true; options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("role"); options.Scope.Add("role");
options.Scope.Add("email"); options.Scope.Add("email");
options.Scope.Add("phone"); options.Scope.Add("phone");
options.Scope.Add("MyProjectName"); options.Scope.Add("MyProjectName");
}); });
} }
private void ConfigureAutoMapper() private void ConfigureAutoMapper()
{
Configure<AbpAutoMapperOptions>(options =>
{ {
Configure<AbpAutoMapperOptions>(options => options.AddMaps<MyProjectNameWebHostModule>();
{ });
options.AddMaps<MyProjectNameWebHostModule>(); }
});
}
private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment) private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment)
{
if (hostingEnvironment.IsDevelopment())
{ {
if (hostingEnvironment.IsDevelopment()) Configure<AbpVirtualFileSystemOptions>(options =>
{ {
Configure<AbpVirtualFileSystemOptions>(options =>
{
//<TEMPLATE-REMOVE> //<TEMPLATE-REMOVE>
options.FileSets.ReplaceEmbeddedByPhysical<AbpUiModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.UI", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<AbpUiModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.UI", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiBootstrapModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Bootstrap", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiBootstrapModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Bootstrap", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiThemeSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiThemeSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}framework{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiBasicThemeModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}basic-theme{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<AbpAspNetCoreMvcUiBasicThemeModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}basic-theme{0}src{0}Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<AbpPermissionManagementWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}permission-management{0}src{0}Volo.Abp.PermissionManagement.Web", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<AbpPermissionManagementWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}permission-management{0}src{0}Volo.Abp.PermissionManagement.Web", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<AbpIdentityWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}identity{0}src{0}Volo.Abp.Identity.Web", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<AbpIdentityWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}..{0}..{0}..{0}modules{0}identity{0}src{0}Volo.Abp.Identity.Web", Path.DirectorySeparatorChar)));
//</TEMPLATE-REMOVE> //</TEMPLATE-REMOVE>
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Web", Path.DirectorySeparatorChar))); options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Web", Path.DirectorySeparatorChar)));
}); });
}
} }
}
private void ConfigureSwaggerServices(IServiceCollection services) private void ConfigureSwaggerServices(IServiceCollection services)
{
services.AddAbpSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
}
);
}
private void ConfigureDataProtection(
ServiceConfigurationContext context,
IConfiguration configuration,
IWebHostEnvironment hostingEnvironment)
{
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("MyProjectName");
if (!hostingEnvironment.IsDevelopment())
{ {
services.AddAbpSwaggerGen( var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
options => dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys");
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
}
);
} }
}
private void ConfigureDataProtection( public override void OnApplicationInitialization(ApplicationInitializationContext context)
ServiceConfigurationContext context, {
IConfiguration configuration, var app = context.GetApplicationBuilder();
IWebHostEnvironment hostingEnvironment) var env = context.GetEnvironment();
if (env.IsDevelopment())
{ {
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("MyProjectName"); app.UseDeveloperExceptionPage();
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "MyProjectName-Protection-Keys");
}
} }
else
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{ {
var app = context.GetApplicationBuilder(); app.UseErrorPage();
var env = context.GetEnvironment(); app.UseHsts();
}
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseErrorPage();
app.UseHsts();
}
app.UseHttpsRedirection(); app.UseHttpsRedirection();
app.UseStaticFiles(); app.UseStaticFiles();
app.UseRouting(); app.UseRouting();
app.UseAuthentication(); app.UseAuthentication();
if (MultiTenancyConsts.IsEnabled) if (MultiTenancyConsts.IsEnabled)
{ {
app.UseMultiTenancy(); app.UseMultiTenancy();
} }
app.UseAbpRequestLocalization(); app.UseAbpRequestLocalization();
app.UseAuthorization(); app.UseAuthorization();
app.UseSwagger(); app.UseSwagger();
app.UseAbpSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API");
}); });
app.UseAuditing(); app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints(); app.UseConfiguredEndpoints();
}
} }
} }

21
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Pages/Index.cshtml.cs

@ -1,18 +1,17 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication;
namespace MyCompanyName.MyProjectName.Pages namespace MyCompanyName.MyProjectName.Pages;
public class IndexModel : MyProjectNamePageModel
{ {
public class IndexModel : MyProjectNamePageModel public void OnGet()
{ {
public void OnGet()
{
}
public async Task OnPostLoginAsync()
{
await HttpContext.ChallengeAsync("oidc");
}
} }
}
public async Task OnPostLoginAsync()
{
await HttpContext.ChallengeAsync("oidc");
}
}

13
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Pages/MyProjectNamePageModel.cs

@ -1,13 +1,12 @@
using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
namespace MyCompanyName.MyProjectName.Pages namespace MyCompanyName.MyProjectName.Pages;
public abstract class MyProjectNamePageModel : AbpPageModel
{ {
public abstract class MyProjectNamePageModel : AbpPageModel protected MyProjectNamePageModel()
{ {
protected MyProjectNamePageModel() LocalizationResourceType = typeof(MyProjectNameResource);
{
LocalizationResourceType = typeof(MyProjectNameResource);
}
} }
} }

63
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Program.cs

@ -6,51 +6,50 @@ using Microsoft.Extensions.Hosting;
using Serilog; using Serilog;
using Serilog.Events; using Serilog.Events;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class Program
{ {
public class Program public static int Main(string[] args)
{ {
public static int Main(string[] args) Log.Logger = new LoggerConfiguration()
{
Log.Logger = new LoggerConfiguration()
#if DEBUG #if DEBUG
.MinimumLevel.Debug() .MinimumLevel.Debug()
#else #else
.MinimumLevel.Information() .MinimumLevel.Information()
#endif #endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext() .Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.File("Logs/logs.txt"))
#if DEBUG #if DEBUG
.WriteTo.Async(c => c.Console()) .WriteTo.Async(c => c.Console())
#endif #endif
.CreateLogger(); .CreateLogger();
try try
{ {
Log.Information("Starting web host."); Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run(); CreateHostBuilder(args).Build().Run();
return 0; return 0;
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Fatal(ex, "Host terminated unexpectedly!"); Log.Fatal(ex, "Host terminated unexpectedly!");
return 1; return 1;
} }
finally finally
{ {
Log.CloseAndFlush(); Log.CloseAndFlush();
}
} }
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
} }
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
} }

19
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/Startup.cs

@ -2,18 +2,17 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class Startup
{ {
public class Startup public void ConfigureServices(IServiceCollection services)
{ {
public void ConfigureServices(IServiceCollection services) services.AddApplication<MyProjectNameWebHostModule>();
{ }
services.AddApplication<MyProjectNameWebHostModule>();
}
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{ {
app.InitializeApplication(); app.InitializeApplication();
}
} }
} }

33
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/EntityFrameworkCore/UnifiedDbContext.cs

@ -7,27 +7,26 @@ using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.TenantManagement.EntityFrameworkCore; using Volo.Abp.TenantManagement.EntityFrameworkCore;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
public class UnifiedDbContext : AbpDbContext<UnifiedDbContext>
{ {
public class UnifiedDbContext : AbpDbContext<UnifiedDbContext> public UnifiedDbContext(DbContextOptions<UnifiedDbContext> options)
: base(options)
{ {
public UnifiedDbContext(DbContextOptions<UnifiedDbContext> options)
: base(options)
{
} }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
{ {
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
modelBuilder.ConfigurePermissionManagement(); modelBuilder.ConfigurePermissionManagement();
modelBuilder.ConfigureSettingManagement(); modelBuilder.ConfigureSettingManagement();
modelBuilder.ConfigureAuditLogging(); modelBuilder.ConfigureAuditLogging();
modelBuilder.ConfigureIdentity(); modelBuilder.ConfigureIdentity();
modelBuilder.ConfigureFeatureManagement(); modelBuilder.ConfigureFeatureManagement();
modelBuilder.ConfigureTenantManagement(); modelBuilder.ConfigureTenantManagement();
modelBuilder.ConfigureMyProjectName(); modelBuilder.ConfigureMyProjectName();
}
} }
} }

31
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/EntityFrameworkCore/UnifiedDbContextFactory.cs

@ -3,27 +3,26 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
public class UnifiedDbContextFactory : IDesignTimeDbContextFactory<UnifiedDbContext>
{ {
public class UnifiedDbContextFactory : IDesignTimeDbContextFactory<UnifiedDbContext> public UnifiedDbContext CreateDbContext(string[] args)
{ {
public UnifiedDbContext CreateDbContext(string[] args) var configuration = BuildConfiguration();
{
var configuration = BuildConfiguration();
var builder = new DbContextOptionsBuilder<UnifiedDbContext>() var builder = new DbContextOptionsBuilder<UnifiedDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default")); .UseSqlServer(configuration.GetConnectionString("Default"));
return new UnifiedDbContext(builder.Options); return new UnifiedDbContext(builder.Options);
} }
private static IConfigurationRoot BuildConfiguration() private static IConfigurationRoot BuildConfiguration()
{ {
var builder = new ConfigurationBuilder() var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory()) .SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false); .AddJsonFile("appsettings.json", optional: false);
return builder.Build(); return builder.Build();
}
} }
} }

1391
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20211105130018_Initial.cs

File diff suppressed because it is too large

247
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs

@ -41,152 +41,151 @@ using Volo.Abp.TenantManagement.Web;
using Volo.Abp.Threading; using Volo.Abp.Threading;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(MyProjectNameWebModule),
typeof(MyProjectNameApplicationModule),
typeof(MyProjectNameHttpApiModule),
typeof(MyProjectNameEntityFrameworkCoreModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpAutofacModule),
typeof(AbpAccountWebModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAccountHttpApiModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpPermissionManagementHttpApiModule),
typeof(AbpIdentityWebModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpFeatureManagementWebModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpFeatureManagementHttpApiModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpTenantManagementWebModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementHttpApiModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule)
)]
public class MyProjectNameWebUnifiedModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameWebModule),
typeof(MyProjectNameApplicationModule),
typeof(MyProjectNameHttpApiModule),
typeof(MyProjectNameEntityFrameworkCoreModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
typeof(AbpAutofacModule),
typeof(AbpAccountWebModule),
typeof(AbpAccountApplicationModule),
typeof(AbpAccountHttpApiModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementApplicationModule),
typeof(AbpPermissionManagementHttpApiModule),
typeof(AbpIdentityWebModule),
typeof(AbpIdentityApplicationModule),
typeof(AbpIdentityHttpApiModule),
typeof(AbpIdentityEntityFrameworkCoreModule),
typeof(AbpPermissionManagementDomainIdentityModule),
typeof(AbpFeatureManagementWebModule),
typeof(AbpFeatureManagementApplicationModule),
typeof(AbpFeatureManagementHttpApiModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpTenantManagementWebModule),
typeof(AbpTenantManagementApplicationModule),
typeof(AbpTenantManagementHttpApiModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule)
)]
public class MyProjectNameWebUnifiedModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
Configure<AbpDbContextOptions>(options =>
{ {
var hostingEnvironment = context.Services.GetHostingEnvironment(); options.UseSqlServer();
var configuration = context.Services.GetConfiguration(); });
Configure<AbpDbContextOptions>(options => if (hostingEnvironment.IsDevelopment())
{
Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.UseSqlServer(); options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Web", Path.DirectorySeparatorChar)));
}); });
}
if (hostingEnvironment.IsDevelopment()) context.Services.AddAbpSwaggerGen(
options =>
{ {
Configure<AbpVirtualFileSystemOptions>(options => options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });
{ options.DocInclusionPredicate((docName, description) => true);
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain.Shared", Path.DirectorySeparatorChar))); options.CustomSchemaIds(type => type.FullName);
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Application", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<MyProjectNameWebModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}MyCompanyName.MyProjectName.Web", Path.DirectorySeparatorChar)));
});
}
context.Services.AddAbpSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
});
Configure<AbpLocalizationOptions>(options =>
{
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português (Brasil)"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
}); });
Configure<AbpMultiTenancyOptions>(options => Configure<AbpLocalizationOptions>(options =>
{ {
options.IsEnabled = MultiTenancyConsts.IsEnabled; options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
}); options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in"));
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is"));
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it"));
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português (Brasil)"));
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
});
Configure<AbpMultiTenancyOptions>(options =>
{
options.IsEnabled = MultiTenancyConsts.IsEnabled;
});
#if DEBUG #if DEBUG
context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>()); context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
#endif #endif
} }
public override void OnApplicationInitialization(ApplicationInitializationContext context) public override void OnApplicationInitialization(ApplicationInitializationContext context)
{ {
var app = context.GetApplicationBuilder(); var app = context.GetApplicationBuilder();
var env = context.GetEnvironment(); var env = context.GetEnvironment();
if (env.IsDevelopment()) if (env.IsDevelopment())
{ {
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
} }
else else
{ {
app.UseErrorPage(); app.UseErrorPage();
app.UseHsts(); app.UseHsts();
} }
app.UseHttpsRedirection(); app.UseHttpsRedirection();
app.UseStaticFiles(); app.UseStaticFiles();
app.UseRouting(); app.UseRouting();
app.UseAuthentication(); app.UseAuthentication();
if (MultiTenancyConsts.IsEnabled) if (MultiTenancyConsts.IsEnabled)
{ {
app.UseMultiTenancy(); app.UseMultiTenancy();
} }
app.UseAbpRequestLocalization(); app.UseAbpRequestLocalization();
app.UseAuthorization(); app.UseAuthorization();
app.UseSwagger(); app.UseSwagger();
app.UseAbpSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
}); });
app.UseAuditing(); app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();
app.UseConfiguredEndpoints(); app.UseConfiguredEndpoints();
using (var scope = context.ServiceProvider.CreateScope()) using (var scope = context.ServiceProvider.CreateScope())
{
AsyncHelper.RunSync(async () =>
{ {
AsyncHelper.RunSync(async () => await scope.ServiceProvider
{ .GetRequiredService<IDataSeeder>()
await scope.ServiceProvider .SeedAsync();
.GetRequiredService<IDataSeeder>() });
.SeedAsync();
});
}
} }
} }
} }

11
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Pages/Index.cshtml.cs

@ -1,11 +1,10 @@
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
namespace MyCompanyName.MyProjectName.Pages namespace MyCompanyName.MyProjectName.Pages;
public class IndexModel : PageModel
{ {
public class IndexModel : PageModel public void OnGet()
{ {
public void OnGet()
{
}
} }
} }

67
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Program.cs

@ -6,47 +6,46 @@ using Microsoft.Extensions.Hosting;
using Serilog; using Serilog;
using Serilog.Events; using Serilog.Events;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class Program
{ {
public class Program public static int Main(string[] args)
{ {
public static int Main(string[] args) Log.Logger = new LoggerConfiguration()
{ .MinimumLevel.Debug()
Log.Logger = new LoggerConfiguration() .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.MinimumLevel.Debug() .Enrich.FromLogContext()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information) .WriteTo.Async(c => c.File("Logs/logs.txt"))
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt"))
#if DEBUG #if DEBUG
.WriteTo.Async(c => c.Console()) .WriteTo.Async(c => c.Console())
#endif #endif
.CreateLogger(); .CreateLogger();
try try
{ {
Log.Information("Starting web host."); Log.Information("Starting web host.");
CreateHostBuilder(args).Build().Run(); CreateHostBuilder(args).Build().Run();
return 0; return 0;
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Fatal(ex, "Host terminated unexpectedly!"); Log.Fatal(ex, "Host terminated unexpectedly!");
return 1; return 1;
} }
finally finally
{ {
Log.CloseAndFlush(); Log.CloseAndFlush();
}
} }
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
} }
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.AddAppSettingsSecretsJson()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
} }

19
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Startup.cs

@ -3,18 +3,17 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class Startup
{ {
public class Startup public void ConfigureServices(IServiceCollection services)
{ {
public void ConfigureServices(IServiceCollection services) services.AddApplication<MyProjectNameWebUnifiedModule>();
{ }
services.AddApplication<MyProjectNameWebUnifiedModule>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{ {
app.InitializeApplication(); app.InitializeApplication();
}
} }
} }

17
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyProjectNameApplicationContractsModule.cs

@ -2,15 +2,14 @@
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Authorization; using Volo.Abp.Authorization;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(MyProjectNameDomainSharedModule),
typeof(AbpDddApplicationContractsModule),
typeof(AbpAuthorizationModule)
)]
public class MyProjectNameApplicationContractsModule : AbpModule
{ {
[DependsOn(
typeof(MyProjectNameDomainSharedModule),
typeof(AbpDddApplicationContractsModule),
typeof(AbpAuthorizationModule)
)]
public class MyProjectNameApplicationContractsModule : AbpModule
{
}
} }

11
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/MyProjectNameRemoteServiceConsts.cs

@ -1,9 +1,8 @@
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class MyProjectNameRemoteServiceConsts
{ {
public class MyProjectNameRemoteServiceConsts public const string RemoteServiceName = "MyProjectName";
{
public const string RemoteServiceName = "MyProjectName";
public const string ModuleName = "myProjectName"; public const string ModuleName = "myProjectName";
}
} }

21
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissionDefinitionProvider.cs

@ -2,18 +2,17 @@
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization; using Volo.Abp.Localization;
namespace MyCompanyName.MyProjectName.Permissions namespace MyCompanyName.MyProjectName.Permissions;
public class MyProjectNamePermissionDefinitionProvider : PermissionDefinitionProvider
{ {
public class MyProjectNamePermissionDefinitionProvider : PermissionDefinitionProvider public override void Define(IPermissionDefinitionContext context)
{ {
public override void Define(IPermissionDefinitionContext context) var myGroup = context.AddGroup(MyProjectNamePermissions.GroupName, L("Permission:MyProjectName"));
{ }
var myGroup = context.AddGroup(MyProjectNamePermissions.GroupName, L("Permission:MyProjectName"));
}
private static LocalizableString L(string name) private static LocalizableString L(string name)
{ {
return LocalizableString.Create<MyProjectNameResource>(name); return LocalizableString.Create<MyProjectNameResource>(name);
}
} }
} }

17
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Permissions/MyProjectNamePermissions.cs

@ -1,14 +1,13 @@
using Volo.Abp.Reflection; using Volo.Abp.Reflection;
namespace MyCompanyName.MyProjectName.Permissions namespace MyCompanyName.MyProjectName.Permissions;
public class MyProjectNamePermissions
{ {
public class MyProjectNamePermissions public const string GroupName = "MyProjectName";
{
public const string GroupName = "MyProjectName";
public static string[] GetAll() public static string[] GetAll()
{ {
return ReflectionHelper.GetPublicConstantsRecursively(typeof(MyProjectNamePermissions)); return ReflectionHelper.GetPublicConstantsRecursively(typeof(MyProjectNamePermissions));
}
} }
} }

11
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Samples/ISampleAppService.cs

@ -1,12 +1,11 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
namespace MyCompanyName.MyProjectName.Samples namespace MyCompanyName.MyProjectName.Samples;
public interface ISampleAppService : IApplicationService
{ {
public interface ISampleAppService : IApplicationService Task<SampleDto> GetAsync();
{
Task<SampleDto> GetAsync();
Task<SampleDto> GetAuthorizedAsync(); Task<SampleDto> GetAuthorizedAsync();
}
} }

11
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application.Contracts/Samples/SampleDto.cs

@ -1,7 +1,6 @@
namespace MyCompanyName.MyProjectName.Samples namespace MyCompanyName.MyProjectName.Samples;
public class SampleDto
{ {
public class SampleDto public int Value { get; set; }
{ }
public int Value { get; set; }
}
}

13
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyProjectNameAppService.cs

@ -1,14 +1,13 @@
using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Localization;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public abstract class MyProjectNameAppService : ApplicationService
{ {
public abstract class MyProjectNameAppService : ApplicationService protected MyProjectNameAppService()
{ {
protected MyProjectNameAppService() LocalizationResource = typeof(MyProjectNameResource);
{ ObjectMapperContext = typeof(MyProjectNameApplicationModule);
LocalizationResource = typeof(MyProjectNameResource);
ObjectMapperContext = typeof(MyProjectNameApplicationModule);
}
} }
} }

17
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationAutoMapperProfile.cs

@ -1,14 +1,13 @@
using AutoMapper; using AutoMapper;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public class MyProjectNameApplicationAutoMapperProfile : Profile
{ {
public class MyProjectNameApplicationAutoMapperProfile : Profile public MyProjectNameApplicationAutoMapperProfile()
{ {
public MyProjectNameApplicationAutoMapperProfile() /* You can configure your AutoMapper mapping configuration here.
{ * Alternatively, you can split your mapping configurations
/* You can configure your AutoMapper mapping configuration here. * into multiple profile classes for a better organization. */
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
}
} }
} }

29
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs

@ -3,23 +3,22 @@ using Volo.Abp.AutoMapper;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Application; using Volo.Abp.Application;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(MyProjectNameDomainModule),
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpDddApplicationModule),
typeof(AbpAutoMapperModule)
)]
public class MyProjectNameApplicationModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameDomainModule),
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpDddApplicationModule),
typeof(AbpAutoMapperModule)
)]
public class MyProjectNameApplicationModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) context.Services.AddAutoMapperObjectMapper<MyProjectNameApplicationModule>();
Configure<AbpAutoMapperOptions>(options =>
{ {
context.Services.AddAutoMapperObjectMapper<MyProjectNameApplicationModule>(); options.AddMaps<MyProjectNameApplicationModule>(validate: true);
Configure<AbpAutoMapperOptions>(options => });
{
options.AddMaps<MyProjectNameApplicationModule>(validate: true);
});
}
} }
} }

43
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Application/Samples/SampleAppService.cs

@ -1,29 +1,28 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
namespace MyCompanyName.MyProjectName.Samples namespace MyCompanyName.MyProjectName.Samples;
public class SampleAppService : MyProjectNameAppService, ISampleAppService
{ {
public class SampleAppService : MyProjectNameAppService, ISampleAppService public Task<SampleDto> GetAsync()
{ {
public Task<SampleDto> GetAsync() return Task.FromResult(
{ new SampleDto
return Task.FromResult( {
new SampleDto Value = 42
{ }
Value = 42 );
} }
);
}
[Authorize] [Authorize]
public Task<SampleDto> GetAuthorizedAsync() public Task<SampleDto> GetAuthorizedAsync()
{ {
return Task.FromResult( return Task.FromResult(
new SampleDto new SampleDto
{ {
Value = 42 Value = 42
} }
); );
}
} }
} }

19
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorServerModule.cs

@ -1,14 +1,13 @@
using Volo.Abp.AspNetCore.Components.Server.Theming; using Volo.Abp.AspNetCore.Components.Server.Theming;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace MyCompanyName.MyProjectName.Blazor.Server namespace MyCompanyName.MyProjectName.Blazor.Server;
[DependsOn(
typeof(AbpAspNetCoreComponentsServerThemingModule),
typeof(MyProjectNameBlazorModule)
)]
public class MyProjectNameBlazorServerModule : AbpModule
{ {
[DependsOn(
typeof(AbpAspNetCoreComponentsServerThemingModule), }
typeof(MyProjectNameBlazorModule)
)]
public class MyProjectNameBlazorServerModule : AbpModule
{
}
}

21
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebAssembly/MyProjectNameBlazorWebAssemblyModule.cs

@ -1,15 +1,14 @@
using Volo.Abp.AspNetCore.Components.WebAssembly.Theming; using Volo.Abp.AspNetCore.Components.WebAssembly.Theming;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace MyCompanyName.MyProjectName.Blazor.WebAssembly namespace MyCompanyName.MyProjectName.Blazor.WebAssembly;
[DependsOn(
typeof(MyProjectNameBlazorModule),
typeof(MyProjectNameHttpApiClientModule),
typeof(AbpAspNetCoreComponentsWebAssemblyThemingModule)
)]
public class MyProjectNameBlazorWebAssemblyModule : AbpModule
{ {
[DependsOn(
typeof(MyProjectNameBlazorModule), }
typeof(MyProjectNameHttpApiClientModule),
typeof(AbpAspNetCoreComponentsWebAssemblyThemingModule)
)]
public class MyProjectNameBlazorWebAssemblyModule : AbpModule
{
}
}

29
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs

@ -1,24 +1,23 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation;
namespace MyCompanyName.MyProjectName.Blazor.Menus namespace MyCompanyName.MyProjectName.Blazor.Menus;
public class MyProjectNameMenuContributor : IMenuContributor
{ {
public class MyProjectNameMenuContributor : IMenuContributor public async Task ConfigureMenuAsync(MenuConfigurationContext context)
{ {
public async Task ConfigureMenuAsync(MenuConfigurationContext context) if (context.Menu.Name == StandardMenus.Main)
{ {
if (context.Menu.Name == StandardMenus.Main) await ConfigureMainMenuAsync(context);
{
await ConfigureMainMenuAsync(context);
}
} }
}
private Task ConfigureMainMenuAsync(MenuConfigurationContext context) private Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{ {
//Add main menu items. //Add main menu items.
context.Menu.AddItem(new ApplicationMenuItem(MyProjectNameMenus.Prefix, displayName: "MyProjectName", "/MyProjectName", icon: "fa fa-globe")); context.Menu.AddItem(new ApplicationMenuItem(MyProjectNameMenus.Prefix, displayName: "MyProjectName", "/MyProjectName", icon: "fa fa-globe"));
return Task.CompletedTask; return Task.CompletedTask;
}
} }
} }

15
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenus.cs

@ -1,11 +1,10 @@
namespace MyCompanyName.MyProjectName.Blazor.Menus namespace MyCompanyName.MyProjectName.Blazor.Menus;
public class MyProjectNameMenus
{ {
public class MyProjectNameMenus public const string Prefix = "MyProjectName";
{
public const string Prefix = "MyProjectName";
//Add your menu items here... //Add your menu items here...
//public const string Home = Prefix + ".MyNewMenuItem"; //public const string Home = Prefix + ".MyNewMenuItem";
} }
}

17
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorAutoMapperProfile.cs

@ -1,14 +1,13 @@
using AutoMapper; using AutoMapper;
namespace MyCompanyName.MyProjectName.Blazor namespace MyCompanyName.MyProjectName.Blazor;
public class MyProjectNameBlazorAutoMapperProfile : Profile
{ {
public class MyProjectNameBlazorAutoMapperProfile : Profile public MyProjectNameBlazorAutoMapperProfile()
{ {
public MyProjectNameBlazorAutoMapperProfile() /* You can configure your AutoMapper mapping configuration here.
{ * Alternatively, you can split your mapping configurations
/* You can configure your AutoMapper mapping configuration here. * into multiple profile classes for a better organization. */
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
}
} }
} }

47
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs

@ -6,33 +6,32 @@ using Volo.Abp.AutoMapper;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation;
namespace MyCompanyName.MyProjectName.Blazor namespace MyCompanyName.MyProjectName.Blazor;
[DependsOn(
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpAspNetCoreComponentsWebThemingModule),
typeof(AbpAutoMapperModule)
)]
public class MyProjectNameBlazorModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpAspNetCoreComponentsWebThemingModule),
typeof(AbpAutoMapperModule)
)]
public class MyProjectNameBlazorModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) context.Services.AddAutoMapperObjectMapper<MyProjectNameBlazorModule>();
{
context.Services.AddAutoMapperObjectMapper<MyProjectNameBlazorModule>();
Configure<AbpAutoMapperOptions>(options => Configure<AbpAutoMapperOptions>(options =>
{ {
options.AddProfile<MyProjectNameBlazorAutoMapperProfile>(validate: true); options.AddProfile<MyProjectNameBlazorAutoMapperProfile>(validate: true);
}); });
Configure<AbpNavigationOptions>(options => Configure<AbpNavigationOptions>(options =>
{ {
options.MenuContributors.Add(new MyProjectNameMenuContributor()); options.MenuContributors.Add(new MyProjectNameMenuContributor());
}); });
Configure<AbpRouterOptions>(options => Configure<AbpRouterOptions>(options =>
{ {
options.AdditionalAssemblies.Add(typeof(MyProjectNameBlazorModule).Assembly); options.AdditionalAssemblies.Add(typeof(MyProjectNameBlazorModule).Assembly);
}); });
}
} }
} }

11
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectNameResource.cs

@ -1,10 +1,9 @@
using Volo.Abp.Localization; using Volo.Abp.Localization;
namespace MyCompanyName.MyProjectName.Localization namespace MyCompanyName.MyProjectName.Localization;
[LocalizationResourceName("MyProjectName")]
public class MyProjectNameResource
{ {
[LocalizationResourceName("MyProjectName")]
public class MyProjectNameResource
{
}
} }

43
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameDomainSharedModule.cs

@ -6,32 +6,31 @@ using Volo.Abp.Validation;
using Volo.Abp.Validation.Localization; using Volo.Abp.Validation.Localization;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(AbpValidationModule)
)]
public class MyProjectNameDomainSharedModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(AbpValidationModule)
)]
public class MyProjectNameDomainSharedModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) Configure<AbpVirtualFileSystemOptions>(options =>
{ {
Configure<AbpVirtualFileSystemOptions>(options => options.FileSets.AddEmbedded<MyProjectNameDomainSharedModule>();
{ });
options.FileSets.AddEmbedded<MyProjectNameDomainSharedModule>();
});
Configure<AbpLocalizationOptions>(options => Configure<AbpLocalizationOptions>(options =>
{ {
options.Resources options.Resources
.Add<MyProjectNameResource>("en") .Add<MyProjectNameResource>("en")
.AddBaseTypes(typeof(AbpValidationResource)) .AddBaseTypes(typeof(AbpValidationResource))
.AddVirtualJson("/Localization/MyProjectName"); .AddVirtualJson("/Localization/MyProjectName");
}); });
Configure<AbpExceptionLocalizationOptions>(options => Configure<AbpExceptionLocalizationOptions>(options =>
{ {
options.MapCodeNamespace("MyProjectName", typeof(MyProjectNameResource)); options.MapCodeNamespace("MyProjectName", typeof(MyProjectNameResource));
}); });
}
} }
} }

9
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyProjectNameErrorCodes.cs

@ -1,7 +1,6 @@
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public static class MyProjectNameErrorCodes
{ {
public static class MyProjectNameErrorCodes //Add your business exception error codes here...
{
//Add your business exception error codes here...
}
} }

13
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDbProperties.cs

@ -1,11 +1,10 @@
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public static class MyProjectNameDbProperties
{ {
public static class MyProjectNameDbProperties public static string DbTablePrefix { get; set; } = "MyProjectName";
{
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"; public const string ConnectionStringName = "MyProjectName";
}
} }

15
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs

@ -1,14 +1,13 @@
using Volo.Abp.Domain; using Volo.Abp.Domain;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(AbpDddDomainModule),
typeof(MyProjectNameDomainSharedModule)
)]
public class MyProjectNameDomainModule : AbpModule
{ {
[DependsOn(
typeof(AbpDddDomainModule),
typeof(MyProjectNameDomainSharedModule)
)]
public class MyProjectNameDomainModule : AbpModule
{
}
} }

17
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Settings/MyProjectNameSettingDefinitionProvider.cs

@ -1,14 +1,13 @@
using Volo.Abp.Settings; using Volo.Abp.Settings;
namespace MyCompanyName.MyProjectName.Settings namespace MyCompanyName.MyProjectName.Settings;
public class MyProjectNameSettingDefinitionProvider : SettingDefinitionProvider
{ {
public class MyProjectNameSettingDefinitionProvider : SettingDefinitionProvider public override void Define(ISettingDefinitionContext context)
{ {
public override void Define(ISettingDefinitionContext context) /* Define module settings here.
{ * Use names from MyProjectNameSettings class.
/* Define module settings here. */
* Use names from MyProjectNameSettings class.
*/
}
} }
} }

17
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Settings/MyProjectNameSettings.cs

@ -1,11 +1,10 @@
namespace MyCompanyName.MyProjectName.Settings namespace MyCompanyName.MyProjectName.Settings;
public static class MyProjectNameSettings
{ {
public static class MyProjectNameSettings public const string GroupName = "MyProjectName";
{
public const string GroupName = "MyProjectName";
/* Add constants for setting names. Example: /* Add constants for setting names. Example:
* public const string MySettingName = GroupName + ".MySettingName"; * public const string MySettingName = GroupName + ".MySettingName";
*/ */
} }
}

17
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/IMyProjectNameDbContext.cs

@ -1,13 +1,12 @@
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
[ConnectionStringName(MyProjectNameDbProperties.ConnectionStringName)]
public interface IMyProjectNameDbContext : IEfCoreDbContext
{ {
[ConnectionStringName(MyProjectNameDbProperties.ConnectionStringName)] /* Add DbSet for each Aggregate Root here. Example:
public interface IMyProjectNameDbContext : IEfCoreDbContext * DbSet<Question> Questions { get; }
{ */
/* Add DbSet for each Aggregate Root here. Example: }
* DbSet<Question> Questions { get; }
*/
}
}

33
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContext.cs

@ -2,26 +2,25 @@
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
[ConnectionStringName(MyProjectNameDbProperties.ConnectionStringName)]
public class MyProjectNameDbContext : AbpDbContext<MyProjectNameDbContext>, IMyProjectNameDbContext
{ {
[ConnectionStringName(MyProjectNameDbProperties.ConnectionStringName)] /* Add DbSet for each Aggregate Root here. Example:
public class MyProjectNameDbContext : AbpDbContext<MyProjectNameDbContext>, IMyProjectNameDbContext * public DbSet<Question> Questions { get; set; }
{ */
/* Add DbSet for each Aggregate Root here. Example:
* public DbSet<Question> Questions { get; set; }
*/
public MyProjectNameDbContext(DbContextOptions<MyProjectNameDbContext> options) public MyProjectNameDbContext(DbContextOptions<MyProjectNameDbContext> options)
: base(options) : base(options)
{ {
} }
protected override void OnModelCreating(ModelBuilder builder) protected override void OnModelCreating(ModelBuilder builder)
{ {
base.OnModelCreating(builder); base.OnModelCreating(builder);
builder.ConfigureMyProjectName(); builder.ConfigureMyProjectName();
}
} }
} }

41
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContextModelCreatingExtensions.cs

@ -1,34 +1,33 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Volo.Abp; using Volo.Abp;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
public static class MyProjectNameDbContextModelCreatingExtensions
{ {
public static class MyProjectNameDbContextModelCreatingExtensions public static void ConfigureMyProjectName(
this ModelBuilder builder)
{ {
public static void ConfigureMyProjectName( Check.NotNull(builder, nameof(builder));
this ModelBuilder builder)
{
Check.NotNull(builder, nameof(builder));
/* Configure all entities here. Example: /* Configure all entities here. Example:
builder.Entity<Question>(b => builder.Entity<Question>(b =>
{ {
//Configure table & schema name //Configure table & schema name
b.ToTable(MyProjectNameDbProperties.DbTablePrefix + "Questions", MyProjectNameDbProperties.DbSchema); b.ToTable(MyProjectNameDbProperties.DbTablePrefix + "Questions", MyProjectNameDbProperties.DbSchema);
b.ConfigureByConvention(); b.ConfigureByConvention();
//Properties //Properties
b.Property(q => q.Title).IsRequired().HasMaxLength(QuestionConsts.MaxTitleLength); b.Property(q => q.Title).IsRequired().HasMaxLength(QuestionConsts.MaxTitleLength);
//Relations //Relations
b.HasMany(question => question.Tags).WithOne().HasForeignKey(qt => qt.QuestionId); b.HasMany(question => question.Tags).WithOne().HasForeignKey(qt => qt.QuestionId);
//Indexes //Indexes
b.HasIndex(q => q.CreationTime); b.HasIndex(q => q.CreationTime);
}); });
*/ */
}
} }
} }

23
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreModule.cs

@ -2,22 +2,21 @@
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
[DependsOn(
typeof(MyProjectNameDomainModule),
typeof(AbpEntityFrameworkCoreModule)
)]
public class MyProjectNameEntityFrameworkCoreModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameDomainModule),
typeof(AbpEntityFrameworkCoreModule)
)]
public class MyProjectNameEntityFrameworkCoreModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) context.Services.AddAbpDbContext<MyProjectNameDbContext>(options =>
{ {
context.Services.AddAbpDbContext<MyProjectNameDbContext>(options =>
{
/* Add custom repositories here. Example: /* Add custom repositories here. Example:
* options.AddRepository<Question, EfCoreQuestionRepository>(); * options.AddRepository<Question, EfCoreQuestionRepository>();
*/ */
}); });
}
} }
} }

31
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Client/MyProjectNameHttpApiClientModule.cs

@ -3,25 +3,24 @@ using Volo.Abp.Http.Client;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpHttpClientModule))]
public class MyProjectNameHttpApiClientModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpHttpClientModule))]
public class MyProjectNameHttpApiClientModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) context.Services.AddHttpClientProxies(
{ typeof(MyProjectNameApplicationContractsModule).Assembly,
context.Services.AddHttpClientProxies( MyProjectNameRemoteServiceConsts.RemoteServiceName
typeof(MyProjectNameApplicationContractsModule).Assembly, );
MyProjectNameRemoteServiceConsts.RemoteServiceName
);
Configure<AbpVirtualFileSystemOptions>(options => Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.FileSets.AddEmbedded<MyProjectNameHttpApiClientModule>(); options.FileSets.AddEmbedded<MyProjectNameHttpApiClientModule>();
}); });
}
} }
} }

11
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyProjectNameController.cs

@ -1,13 +1,12 @@
using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Localization;
using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
public abstract class MyProjectNameController : AbpControllerBase
{ {
public abstract class MyProjectNameController : AbpControllerBase protected MyProjectNameController()
{ {
protected MyProjectNameController() LocalizationResource = typeof(MyProjectNameResource);
{
LocalizationResource = typeof(MyProjectNameResource);
}
} }
} }

37
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/MyProjectNameHttpApiModule.cs

@ -5,29 +5,28 @@ using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpAspNetCoreMvcModule))]
public class MyProjectNameHttpApiModule : AbpModule
{ {
[DependsOn( public override void PreConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpAspNetCoreMvcModule))]
public class MyProjectNameHttpApiModule : AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context) PreConfigure<IMvcBuilder>(mvcBuilder =>
{ {
PreConfigure<IMvcBuilder>(mvcBuilder => mvcBuilder.AddApplicationPartIfNotExists(typeof(MyProjectNameHttpApiModule).Assembly);
{ });
mvcBuilder.AddApplicationPartIfNotExists(typeof(MyProjectNameHttpApiModule).Assembly); }
});
}
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpLocalizationOptions>(options =>
{ {
Configure<AbpLocalizationOptions>(options => options.Resources
{ .Get<MyProjectNameResource>()
options.Resources .AddBaseTypes(typeof(AbpUiResource));
.Get<MyProjectNameResource>() });
.AddBaseTypes(typeof(AbpUiResource));
});
}
} }
} }

45
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi/Samples/SampleController.cs

@ -3,32 +3,31 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp; using Volo.Abp;
namespace MyCompanyName.MyProjectName.Samples namespace MyCompanyName.MyProjectName.Samples;
[Area(MyProjectNameRemoteServiceConsts.ModuleName)]
[RemoteService(Name = MyProjectNameRemoteServiceConsts.RemoteServiceName)]
[Route("api/MyProjectName/sample")]
public class SampleController : MyProjectNameController, ISampleAppService
{ {
[Area(MyProjectNameRemoteServiceConsts.ModuleName)] private readonly ISampleAppService _sampleAppService;
[RemoteService(Name = MyProjectNameRemoteServiceConsts.RemoteServiceName)]
[Route("api/MyProjectName/sample")]
public class SampleController : MyProjectNameController, ISampleAppService
{
private readonly ISampleAppService _sampleAppService;
public SampleController(ISampleAppService sampleAppService) public SampleController(ISampleAppService sampleAppService)
{ {
_sampleAppService = sampleAppService; _sampleAppService = sampleAppService;
} }
[HttpGet] [HttpGet]
public async Task<SampleDto> GetAsync() public async Task<SampleDto> GetAsync()
{ {
return await _sampleAppService.GetAsync(); return await _sampleAppService.GetAsync();
} }
[HttpGet] [HttpGet]
[Route("authorized")] [Route("authorized")]
[Authorize] [Authorize]
public async Task<SampleDto> GetAuthorizedAsync() public async Task<SampleDto> GetAuthorizedAsync()
{ {
return await _sampleAppService.GetAsync(); return await _sampleAppService.GetAsync();
}
} }
} }

23
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyProjectNameInstallerModule.cs

@ -2,20 +2,19 @@
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace MyCompany.MyProjectName namespace MyCompany.MyProjectName;
[DependsOn(
typeof(AbpStudioModuleInstallerModule),
typeof(AbpVirtualFileSystemModule)
)]
public class MyProjectNameInstallerModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(AbpStudioModuleInstallerModule),
typeof(AbpVirtualFileSystemModule)
)]
public class MyProjectNameInstallerModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) Configure<AbpVirtualFileSystemOptions>(options =>
{ {
Configure<AbpVirtualFileSystemOptions>(options => options.FileSets.AddEmbedded<MyProjectNameInstallerModule>();
{ });
options.FileSets.AddEmbedded<MyProjectNameInstallerModule>();
});
}
} }
} }

15
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Installer/MyProjectNameInstallerPipelineBuilder.cs

@ -3,15 +3,14 @@ using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Studio.ModuleInstalling; using Volo.Abp.Studio.ModuleInstalling;
namespace MyCompany.MyProjectName namespace MyCompany.MyProjectName;
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(typeof(IModuleInstallingPipelineBuilder))]
public class MyProjectNameInstallerPipelineBuilder : ModuleInstallingPipelineBuilderBase, IModuleInstallingPipelineBuilder, ITransientDependency
{ {
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)] public async Task<ModuleInstallingPipeline> BuildAsync(ModuleInstallingContext context)
[ExposeServices(typeof(IModuleInstallingPipelineBuilder))]
public class MyProjectNameInstallerPipelineBuilder : ModuleInstallingPipelineBuilderBase, IModuleInstallingPipelineBuilder, ITransientDependency
{ {
public async Task<ModuleInstallingPipeline> BuildAsync(ModuleInstallingContext context) return GetBasePipeline(context);
{
return GetBasePipeline(context);
}
} }
} }

15
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDB/IMyProjectNameMongoDbContext.cs

@ -1,13 +1,12 @@
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
namespace MyCompanyName.MyProjectName.MongoDB namespace MyCompanyName.MyProjectName.MongoDB;
[ConnectionStringName(MyProjectNameDbProperties.ConnectionStringName)]
public interface IMyProjectNameMongoDbContext : IAbpMongoDbContext
{ {
[ConnectionStringName(MyProjectNameDbProperties.ConnectionStringName)] /* Define mongo collections here. Example:
public interface IMyProjectNameMongoDbContext : IAbpMongoDbContext * IMongoCollection<Question> Questions { get; }
{ */
/* Define mongo collections here. Example:
* IMongoCollection<Question> Questions { get; }
*/
}
} }

25
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDB/MyProjectNameMongoDbContext.cs

@ -1,20 +1,19 @@
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
namespace MyCompanyName.MyProjectName.MongoDB namespace MyCompanyName.MyProjectName.MongoDB;
[ConnectionStringName(MyProjectNameDbProperties.ConnectionStringName)]
public class MyProjectNameMongoDbContext : AbpMongoDbContext, IMyProjectNameMongoDbContext
{ {
[ConnectionStringName(MyProjectNameDbProperties.ConnectionStringName)] /* Add mongo collections here. Example:
public class MyProjectNameMongoDbContext : AbpMongoDbContext, IMyProjectNameMongoDbContext * public IMongoCollection<Question> Questions => Collection<Question>();
{ */
/* Add mongo collections here. Example:
* public IMongoCollection<Question> Questions => Collection<Question>();
*/
protected override void CreateModel(IMongoModelBuilder modelBuilder) protected override void CreateModel(IMongoModelBuilder modelBuilder)
{ {
base.CreateModel(modelBuilder); base.CreateModel(modelBuilder);
modelBuilder.ConfigureMyProjectName(); modelBuilder.ConfigureMyProjectName();
}
} }
} }

13
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDB/MyProjectNameMongoDbContextExtensions.cs

@ -1,14 +1,13 @@
using Volo.Abp; using Volo.Abp;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
namespace MyCompanyName.MyProjectName.MongoDB namespace MyCompanyName.MyProjectName.MongoDB;
public static class MyProjectNameMongoDbContextExtensions
{ {
public static class MyProjectNameMongoDbContextExtensions public static void ConfigureMyProjectName(
this IMongoModelBuilder builder)
{ {
public static void ConfigureMyProjectName( Check.NotNull(builder, nameof(builder));
this IMongoModelBuilder builder)
{
Check.NotNull(builder, nameof(builder));
}
} }
} }

21
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDB/MyProjectNameMongoDbModule.cs

@ -2,22 +2,21 @@
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
namespace MyCompanyName.MyProjectName.MongoDB namespace MyCompanyName.MyProjectName.MongoDB;
[DependsOn(
typeof(MyProjectNameDomainModule),
typeof(AbpMongoDbModule)
)]
public class MyProjectNameMongoDbModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameDomainModule),
typeof(AbpMongoDbModule)
)]
public class MyProjectNameMongoDbModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) context.Services.AddMongoDbContext<MyProjectNameMongoDbContext>(options =>
{ {
context.Services.AddMongoDbContext<MyProjectNameMongoDbContext>(options =>
{
/* Add custom repositories here. Example: /* Add custom repositories here. Example:
* options.AddRepository<Question, MongoQuestionRepository>(); * options.AddRepository<Question, MongoQuestionRepository>();
*/ */
}); });
}
} }
} }

27
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs

@ -1,24 +1,23 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.UI.Navigation; using Volo.Abp.UI.Navigation;
namespace MyCompanyName.MyProjectName.Web.Menus namespace MyCompanyName.MyProjectName.Web.Menus;
public class MyProjectNameMenuContributor : IMenuContributor
{ {
public class MyProjectNameMenuContributor : IMenuContributor public async Task ConfigureMenuAsync(MenuConfigurationContext context)
{ {
public async Task ConfigureMenuAsync(MenuConfigurationContext context) if (context.Menu.Name == StandardMenus.Main)
{ {
if (context.Menu.Name == StandardMenus.Main) await ConfigureMainMenuAsync(context);
{
await ConfigureMainMenuAsync(context);
}
} }
}
private Task ConfigureMainMenuAsync(MenuConfigurationContext context) private Task ConfigureMainMenuAsync(MenuConfigurationContext context)
{ {
//Add main menu items. //Add main menu items.
context.Menu.AddItem(new ApplicationMenuItem(MyProjectNameMenus.Prefix, displayName: "MyProjectName", "~/MyProjectName", icon: "fa fa-globe")); context.Menu.AddItem(new ApplicationMenuItem(MyProjectNameMenus.Prefix, displayName: "MyProjectName", "~/MyProjectName", icon: "fa fa-globe"));
return Task.CompletedTask; return Task.CompletedTask;
}
} }
} }

15
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenus.cs

@ -1,11 +1,10 @@
namespace MyCompanyName.MyProjectName.Web.Menus namespace MyCompanyName.MyProjectName.Web.Menus;
public class MyProjectNameMenus
{ {
public class MyProjectNameMenus public const string Prefix = "MyProjectName";
{
public const string Prefix = "MyProjectName";
//Add your menu items here... //Add your menu items here...
//public const string Home = Prefix + ".MyNewMenuItem"; //public const string Home = Prefix + ".MyNewMenuItem";
} }
}

17
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebAutoMapperProfile.cs

@ -1,14 +1,13 @@
using AutoMapper; using AutoMapper;
namespace MyCompanyName.MyProjectName.Web namespace MyCompanyName.MyProjectName.Web;
public class MyProjectNameWebAutoMapperProfile : Profile
{ {
public class MyProjectNameWebAutoMapperProfile : Profile public MyProjectNameWebAutoMapperProfile()
{ {
public MyProjectNameWebAutoMapperProfile() /* You can configure your AutoMapper mapping configuration here.
{ * Alternatively, you can split your mapping configurations
/* You can configure your AutoMapper mapping configuration here. * into multiple profile classes for a better organization. */
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
}
} }
} }

67
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs

@ -10,50 +10,49 @@ using Volo.Abp.UI.Navigation;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
using MyCompanyName.MyProjectName.Permissions; using MyCompanyName.MyProjectName.Permissions;
namespace MyCompanyName.MyProjectName.Web namespace MyCompanyName.MyProjectName.Web;
[DependsOn(
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpAspNetCoreMvcUiThemeSharedModule),
typeof(AbpAutoMapperModule)
)]
public class MyProjectNameWebModule : AbpModule
{ {
[DependsOn( public override void PreConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameApplicationContractsModule),
typeof(AbpAspNetCoreMvcUiThemeSharedModule),
typeof(AbpAutoMapperModule)
)]
public class MyProjectNameWebModule : AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context) context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{ {
context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options => options.AddAssemblyResource(typeof(MyProjectNameResource), typeof(MyProjectNameWebModule).Assembly);
{ });
options.AddAssemblyResource(typeof(MyProjectNameResource), typeof(MyProjectNameWebModule).Assembly);
});
PreConfigure<IMvcBuilder>(mvcBuilder => PreConfigure<IMvcBuilder>(mvcBuilder =>
{ {
mvcBuilder.AddApplicationPartIfNotExists(typeof(MyProjectNameWebModule).Assembly); mvcBuilder.AddApplicationPartIfNotExists(typeof(MyProjectNameWebModule).Assembly);
}); });
} }
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpNavigationOptions>(options =>
{ {
Configure<AbpNavigationOptions>(options => options.MenuContributors.Add(new MyProjectNameMenuContributor());
{ });
options.MenuContributors.Add(new MyProjectNameMenuContributor());
});
Configure<AbpVirtualFileSystemOptions>(options => Configure<AbpVirtualFileSystemOptions>(options =>
{ {
options.FileSets.AddEmbedded<MyProjectNameWebModule>(); options.FileSets.AddEmbedded<MyProjectNameWebModule>();
}); });
context.Services.AddAutoMapperObjectMapper<MyProjectNameWebModule>(); context.Services.AddAutoMapperObjectMapper<MyProjectNameWebModule>();
Configure<AbpAutoMapperOptions>(options => Configure<AbpAutoMapperOptions>(options =>
{ {
options.AddMaps<MyProjectNameWebModule>(validate: true); options.AddMaps<MyProjectNameWebModule>(validate: true);
}); });
Configure<RazorPagesOptions>(options => Configure<RazorPagesOptions>(options =>
{ {
//Configure authorization. //Configure authorization.
}); });
}
} }
} }

11
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/MyProjectName/Index.cshtml.cs

@ -1,9 +1,8 @@
namespace MyCompanyName.MyProjectName.Web.Pages.MyProjectName namespace MyCompanyName.MyProjectName.Web.Pages.MyProjectName;
public class IndexModel : MyProjectNamePageModel
{ {
public class IndexModel : MyProjectNamePageModel public void OnGet()
{ {
public void OnGet()
{
}
} }
} }

19
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Pages/MyProjectNamePageModel.cs

@ -1,16 +1,15 @@
using MyCompanyName.MyProjectName.Localization; using MyCompanyName.MyProjectName.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
namespace MyCompanyName.MyProjectName.Web.Pages namespace MyCompanyName.MyProjectName.Web.Pages;
/* Inherit your PageModel classes from this class.
*/
public abstract class MyProjectNamePageModel : AbpPageModel
{ {
/* Inherit your PageModel classes from this class. protected MyProjectNamePageModel()
*/
public abstract class MyProjectNamePageModel : AbpPageModel
{ {
protected MyProjectNamePageModel() LocalizationResourceType = typeof(MyProjectNameResource);
{ ObjectMapperContext = typeof(MyProjectNameWebModule);
LocalizationResourceType = typeof(MyProjectNameResource);
ObjectMapperContext = typeof(MyProjectNameWebModule);
}
} }
} }

15
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationTestBase.cs

@ -1,10 +1,9 @@
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
/* Inherit from this class for your application layer tests.
* See SampleAppService_Tests for example.
*/
public abstract class MyProjectNameApplicationTestBase : MyProjectNameTestBase<MyProjectNameApplicationTestModule>
{ {
/* Inherit from this class for your application layer tests.
* See SampleAppService_Tests for example.
*/
public abstract class MyProjectNameApplicationTestBase : MyProjectNameTestBase<MyProjectNameApplicationTestModule>
{
} }
}

15
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/MyProjectNameApplicationTestModule.cs

@ -1,13 +1,12 @@
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
[DependsOn(
typeof(MyProjectNameApplicationModule),
typeof(MyProjectNameDomainTestModule)
)]
public class MyProjectNameApplicationTestModule : AbpModule
{ {
[DependsOn(
typeof(MyProjectNameApplicationModule),
typeof(MyProjectNameDomainTestModule)
)]
public class MyProjectNameApplicationTestModule : AbpModule
{
}
} }

39
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Application.Tests/Samples/SampleAppService_Tests.cs

@ -2,29 +2,28 @@
using Shouldly; using Shouldly;
using Xunit; using Xunit;
namespace MyCompanyName.MyProjectName.Samples namespace MyCompanyName.MyProjectName.Samples;
public class SampleAppService_Tests : MyProjectNameApplicationTestBase
{ {
public class SampleAppService_Tests : MyProjectNameApplicationTestBase private readonly ISampleAppService _sampleAppService;
{
private readonly ISampleAppService _sampleAppService;
public SampleAppService_Tests() public SampleAppService_Tests()
{ {
_sampleAppService = GetRequiredService<ISampleAppService>(); _sampleAppService = GetRequiredService<ISampleAppService>();
} }
[Fact] [Fact]
public async Task GetAsync() public async Task GetAsync()
{ {
var result = await _sampleAppService.GetAsync(); var result = await _sampleAppService.GetAsync();
result.Value.ShouldBe(42); result.Value.ShouldBe(42);
} }
[Fact] [Fact]
public async Task GetAuthorizedAsync() public async Task GetAuthorizedAsync()
{ {
var result = await _sampleAppService.GetAuthorizedAsync(); var result = await _sampleAppService.GetAuthorizedAsync();
result.Value.ShouldBe(42); result.Value.ShouldBe(42);
}
} }
} }

15
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestBase.cs

@ -1,10 +1,9 @@
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
/* Inherit from this class for your domain layer tests.
* See SampleManager_Tests for example.
*/
public abstract class MyProjectNameDomainTestBase : MyProjectNameTestBase<MyProjectNameDomainTestModule>
{ {
/* Inherit from this class for your domain layer tests.
* See SampleManager_Tests for example.
*/
public abstract class MyProjectNameDomainTestBase : MyProjectNameTestBase<MyProjectNameDomainTestModule>
{
} }
}

23
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestModule.cs

@ -1,17 +1,16 @@
using MyCompanyName.MyProjectName.EntityFrameworkCore; using MyCompanyName.MyProjectName.EntityFrameworkCore;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace MyCompanyName.MyProjectName namespace MyCompanyName.MyProjectName;
/* Domain tests are configured to use the EF Core provider.
* You can switch to MongoDB, however your domain tests should be
* database independent anyway.
*/
[DependsOn(
typeof(MyProjectNameEntityFrameworkCoreTestModule)
)]
public class MyProjectNameDomainTestModule : AbpModule
{ {
/* Domain tests are configured to use the EF Core provider.
* You can switch to MongoDB, however your domain tests should be
* database independent anyway.
*/
[DependsOn(
typeof(MyProjectNameEntityFrameworkCoreTestModule)
)]
public class MyProjectNameDomainTestModule : AbpModule
{
}
} }

23
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.Domain.Tests/Samples/SampleManager_Tests.cs

@ -1,21 +1,20 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Xunit; using Xunit;
namespace MyCompanyName.MyProjectName.Samples namespace MyCompanyName.MyProjectName.Samples;
public class SampleManager_Tests : MyProjectNameDomainTestBase
{ {
public class SampleManager_Tests : MyProjectNameDomainTestBase //private readonly SampleManager _sampleManager;
{
//private readonly SampleManager _sampleManager;
public SampleManager_Tests() public SampleManager_Tests()
{ {
//_sampleManager = GetRequiredService<SampleManager>(); //_sampleManager = GetRequiredService<SampleManager>();
} }
[Fact] [Fact]
public async Task Method1Async() public async Task Method1Async()
{ {
}
} }
} }

15
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestBase.cs

@ -1,10 +1,9 @@
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
/* This class can be used as a base class for EF Core integration tests,
* while SampleRepository_Tests uses a different approach.
*/
public abstract class MyProjectNameEntityFrameworkCoreTestBase : MyProjectNameTestBase<MyProjectNameEntityFrameworkCoreTestModule>
{ {
/* This class can be used as a base class for EF Core integration tests,
* while SampleRepository_Tests uses a different approach.
*/
public abstract class MyProjectNameEntityFrameworkCoreTestBase : MyProjectNameTestBase<MyProjectNameEntityFrameworkCoreTestModule>
{
} }
}

53
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreTestModule.cs

@ -6,38 +6,37 @@ using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Sqlite; using Volo.Abp.EntityFrameworkCore.Sqlite;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore;
[DependsOn(
typeof(MyProjectNameTestBaseModule),
typeof(MyProjectNameEntityFrameworkCoreModule),
typeof(AbpEntityFrameworkCoreSqliteModule)
)]
public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule
{ {
[DependsOn( public override void ConfigureServices(ServiceConfigurationContext context)
typeof(MyProjectNameTestBaseModule),
typeof(MyProjectNameEntityFrameworkCoreModule),
typeof(AbpEntityFrameworkCoreSqliteModule)
)]
public class MyProjectNameEntityFrameworkCoreTestModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) var sqliteConnection = CreateDatabaseAndGetConnection();
{
var sqliteConnection = CreateDatabaseAndGetConnection();
Configure<AbpDbContextOptions>(options => Configure<AbpDbContextOptions>(options =>
{
options.Configure(abpDbContextConfigurationContext =>
{ {
options.Configure(abpDbContextConfigurationContext => abpDbContextConfigurationContext.DbContextOptions.UseSqlite(sqliteConnection);
{
abpDbContextConfigurationContext.DbContextOptions.UseSqlite(sqliteConnection);
});
}); });
} });
}
private static SqliteConnection CreateDatabaseAndGetConnection()
{ private static SqliteConnection CreateDatabaseAndGetConnection()
var connection = new SqliteConnection("Data Source=:memory:"); {
connection.Open(); var connection = new SqliteConnection("Data Source=:memory:");
connection.Open();
new MyProjectNameDbContext(
new DbContextOptionsBuilder<MyProjectNameDbContext>().UseSqlite(connection).Options
).GetService<IRelationalDatabaseCreator>().CreateTables();
new MyProjectNameDbContext( return connection;
new DbContextOptionsBuilder<MyProjectNameDbContext>().UseSqlite(connection).Options
).GetService<IRelationalDatabaseCreator>().CreateTables();
return connection;
}
} }
} }

15
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepository_Tests.cs

@ -1,12 +1,11 @@
using MyCompanyName.MyProjectName.Samples; using MyCompanyName.MyProjectName.Samples;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore.Samples namespace MyCompanyName.MyProjectName.EntityFrameworkCore.Samples;
public class SampleRepository_Tests : SampleRepository_Tests<MyProjectNameEntityFrameworkCoreTestModule>
{ {
public class SampleRepository_Tests : SampleRepository_Tests<MyProjectNameEntityFrameworkCoreTestModule> /* Don't write custom repository tests here, instead write to
{ * the base class.
/* Don't write custom repository tests here, instead write to * One exception can be some specific tests related to EF core.
* the base class. */
* One exception can be some specific tests related to EF core.
*/
}
} }

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save