netcore-blueprint 0.0.63 → 0.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BlueprintTemplate/Host.API/Extensions/DatabaseExtensions.cs +33 -7
- package/BlueprintTemplate/Host.API/Extensions/ModuleExtension.cs +5 -0
- package/BlueprintTemplate/Host.API/Program.cs +12 -1
- package/BlueprintTemplate/Host.API/appsettings.json +1 -0
- package/BlueprintTemplate/Modules/__MODULE__Module/__MODULE__Module.API/__MODULE__Module.cs +1 -0
- package/BlueprintTemplate/Shared.Core/Interfaces/Modules/IModule.cs +1 -0
- package/BlueprintTemplate/Shared.Infrastructure/Services/RepositoryFactory.cs +16 -4
- package/BlueprintTemplate/User.API/UserModule.cs +1 -0
- package/README.md +7 -9
- package/package.json +1 -1
|
@@ -9,28 +9,54 @@ namespace Host.API.Extensions
|
|
|
9
9
|
this IServiceCollection services,
|
|
10
10
|
IConfiguration configuration)
|
|
11
11
|
{
|
|
12
|
-
|
|
13
|
-
configuration.GetConnectionString("MySQL");
|
|
12
|
+
var dbEnabled = configuration.GetValue<bool>("Database:Enabled");
|
|
14
13
|
|
|
15
|
-
if (!
|
|
14
|
+
if (!dbEnabled)
|
|
16
15
|
{
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
mySQLConnectionString,
|
|
20
|
-
ServerVersion.AutoDetect(mySQLConnectionString)));
|
|
16
|
+
Console.WriteLine("⏭️ Database is disabled.");
|
|
17
|
+
return services;
|
|
21
18
|
}
|
|
22
19
|
|
|
20
|
+
var dbType = configuration["Database:Type"]?.ToLower();
|
|
21
|
+
|
|
22
|
+
if (dbType != "mysql")
|
|
23
|
+
return services;
|
|
24
|
+
|
|
25
|
+
var mySQLConnectionString =
|
|
26
|
+
configuration.GetConnectionString("MySql");
|
|
27
|
+
|
|
28
|
+
if (string.IsNullOrEmpty(mySQLConnectionString))
|
|
29
|
+
throw new InvalidOperationException("MySql connection string is missing.");
|
|
30
|
+
|
|
31
|
+
services.AddDbContext<MyDbContext>(options =>
|
|
32
|
+
options.UseMySql(
|
|
33
|
+
mySQLConnectionString,
|
|
34
|
+
ServerVersion.AutoDetect(mySQLConnectionString)));
|
|
35
|
+
|
|
36
|
+
Console.WriteLine("✅ MySQL database registered.");
|
|
37
|
+
|
|
23
38
|
return services;
|
|
24
39
|
}
|
|
25
40
|
|
|
26
41
|
public static void ApplyDatabaseMigrations(this WebApplication app)
|
|
27
42
|
{
|
|
43
|
+
var config = app.Services.GetRequiredService<IConfiguration>();
|
|
44
|
+
var dbEnabled = config.GetValue<bool>("Database:Enabled");
|
|
45
|
+
|
|
46
|
+
if (!dbEnabled)
|
|
47
|
+
{
|
|
48
|
+
Console.WriteLine("⏭️ Skip database migrations (DB disabled).");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
28
52
|
if (!app.Environment.IsDevelopment())
|
|
29
53
|
return;
|
|
30
54
|
|
|
31
55
|
using var scope = app.Services.CreateScope();
|
|
32
56
|
var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>();
|
|
33
57
|
dbContext.Database.Migrate();
|
|
58
|
+
|
|
59
|
+
Console.WriteLine("✅ Database migrations applied.");
|
|
34
60
|
}
|
|
35
61
|
}
|
|
36
62
|
|
|
@@ -9,6 +9,7 @@ namespace Host.API.Extensions
|
|
|
9
9
|
IConfiguration config,
|
|
10
10
|
IMvcBuilder mvcBuilder)
|
|
11
11
|
{
|
|
12
|
+
bool dbEnabled = config.GetValue<bool>("Database:Enabled");
|
|
12
13
|
var modules = AppDomain.CurrentDomain
|
|
13
14
|
.GetAssemblies()
|
|
14
15
|
.SelectMany(a => a.GetTypes())
|
|
@@ -27,6 +28,10 @@ namespace Host.API.Extensions
|
|
|
27
28
|
continue;
|
|
28
29
|
}
|
|
29
30
|
|
|
31
|
+
if (module.RequiresDatabase && !dbEnabled)
|
|
32
|
+
throw new InvalidOperationException(
|
|
33
|
+
$"{module.Name} requires database but Database:Enabled=false");
|
|
34
|
+
|
|
30
35
|
Console.WriteLine($"✅ Register module: {module.Name}");
|
|
31
36
|
module.Register(services, config);
|
|
32
37
|
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
using Host.API.Extensions;
|
|
2
|
+
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
|
2
3
|
|
|
3
4
|
var builder = WebApplication.CreateBuilder(args);
|
|
4
5
|
|
|
5
6
|
// 1. Central MVC
|
|
6
|
-
var mvcBuilder = builder.Services
|
|
7
|
+
var mvcBuilder = builder.Services
|
|
8
|
+
.AddControllers()
|
|
9
|
+
.ConfigureApplicationPartManager(manager =>
|
|
10
|
+
{
|
|
11
|
+
// 🔥 Clear toàn bộ auto-discovered parts
|
|
12
|
+
manager.ApplicationParts.Clear();
|
|
13
|
+
|
|
14
|
+
// 🔐 Chỉ add Host.API assembly
|
|
15
|
+
manager.ApplicationParts.Add(
|
|
16
|
+
new AssemblyPart(typeof(Program).Assembly));
|
|
17
|
+
});
|
|
7
18
|
|
|
8
19
|
// Core
|
|
9
20
|
builder.Services.AddApiCore(builder.Configuration);
|
|
@@ -12,6 +12,7 @@ namespace __MODULE__Module.API
|
|
|
12
12
|
public class __MODULE__Module : IModule
|
|
13
13
|
{
|
|
14
14
|
public string Name => "__MODULE__";
|
|
15
|
+
public bool RequiresDatabase => true;
|
|
15
16
|
public void Register(IServiceCollection services, IConfiguration config)
|
|
16
17
|
{
|
|
17
18
|
__MODULE__CoreDependencyInjection.AddModule(services);
|
|
@@ -7,6 +7,7 @@ namespace Shared.Core.Interfaces.Modules
|
|
|
7
7
|
public interface IModule
|
|
8
8
|
{
|
|
9
9
|
string Name { get; }
|
|
10
|
+
bool RequiresDatabase { get; }
|
|
10
11
|
void Register(IServiceCollection services, IConfiguration config);
|
|
11
12
|
Assembly ApiAssembly { get; }
|
|
12
13
|
Assembly MappingAssembly { get; }
|
|
@@ -9,17 +9,28 @@ namespace Shared.Infrastructure.Services
|
|
|
9
9
|
{
|
|
10
10
|
public class RepositoryFactory<T> : IRepositoryFactory<T> where T : BaseEntity
|
|
11
11
|
{
|
|
12
|
-
private readonly
|
|
12
|
+
private readonly bool _dbEnabled;
|
|
13
|
+
private readonly string? _databaseType;
|
|
13
14
|
private readonly IServiceProvider _serviceProvider;
|
|
14
15
|
|
|
15
16
|
public RepositoryFactory(IConfiguration configuration, IServiceProvider serviceProvider)
|
|
16
17
|
{
|
|
17
|
-
|
|
18
|
+
_dbEnabled = bool.TryParse(configuration["Database:Enabled"], out var result) && result;
|
|
19
|
+
_databaseType = configuration["Database:Type"];
|
|
18
20
|
_serviceProvider = serviceProvider;
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
public IItemInfra<T> CreateItemRepository()
|
|
22
24
|
{
|
|
25
|
+
if (!_dbEnabled)
|
|
26
|
+
{
|
|
27
|
+
throw new InvalidOperationException(
|
|
28
|
+
$"Database is disabled. Repository for {typeof(T).Name} is not available.");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (string.IsNullOrEmpty(_databaseType))
|
|
32
|
+
throw new InvalidOperationException("Database:Type is not configured.");
|
|
33
|
+
|
|
23
34
|
var dbType = _databaseType.ToLower();
|
|
24
35
|
var entityType = typeof(T);
|
|
25
36
|
|
|
@@ -27,10 +38,11 @@ namespace Shared.Infrastructure.Services
|
|
|
27
38
|
{
|
|
28
39
|
"mysql" => typeof(MySQLItemInfra<>).MakeGenericType(entityType),
|
|
29
40
|
"mongodb" => typeof(MongoItemInfra<>).MakeGenericType(entityType),
|
|
30
|
-
_ => throw new ArgumentException("Invalid database type")
|
|
41
|
+
_ => throw new ArgumentException($"Invalid database type: {_databaseType}")
|
|
31
42
|
};
|
|
32
43
|
|
|
33
|
-
return (IItemInfra<T>)ActivatorUtilities.CreateInstance(
|
|
44
|
+
return (IItemInfra<T>)ActivatorUtilities.CreateInstance(
|
|
45
|
+
_serviceProvider, implementationType);
|
|
34
46
|
}
|
|
35
47
|
}
|
|
36
48
|
}
|
|
@@ -12,6 +12,7 @@ namespace UserModule.API
|
|
|
12
12
|
public class UserModule: IModule
|
|
13
13
|
{
|
|
14
14
|
public string Name => "User";
|
|
15
|
+
public bool RequiresDatabase => true;
|
|
15
16
|
public void Register(IServiceCollection services, IConfiguration config)
|
|
16
17
|
{
|
|
17
18
|
UserCoreDependencyInjection.AddModule(services);
|
package/README.md
CHANGED
|
@@ -3,21 +3,20 @@ How to make a blueprint
|
|
|
3
3
|
- npm uninstall -g netcore-blueprint
|
|
4
4
|
- npm install -g netcore-blueprint
|
|
5
5
|
- npm list -g netcore-blueprint
|
|
6
|
-
- create-app
|
|
7
|
-
- create-module
|
|
8
|
-
- copy-module
|
|
6
|
+
- create-app AppName (Sửa connection string)
|
|
7
|
+
- create-module ModuleName EntityName
|
|
8
|
+
- copy-module CopiedModuleName (Run in the folder Modules right outside the solution) (copy-module CopiedModuleName --force)
|
|
9
9
|
|
|
10
10
|
2. Tạo mới 1 module
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
- Thêm ref vào Host.API
|
|
14
|
-
- Bật tắt các module không cần thiết
|
|
15
|
-
- Bật tắt hoặc chuyển đổi DB nếu cần
|
|
11
|
+
- create-module ModuleName EntityName
|
|
12
|
+
- copy-module CopiedModuleName (Chỉnh sửa, sau đó cho vào thư mục cùng cấp với BlueprintTemplate)
|
|
13
|
+
- Thêm ref vào Host.API trong appsettings, mục "Modules" (Bật tắt qua đây)
|
|
16
14
|
|
|
17
15
|
3. Bỏ module
|
|
18
16
|
- Xóa module
|
|
19
17
|
- Bỏ <Folder Name="/Modules/ProductModule/"> ở MyBlueprint.slnx
|
|
20
18
|
- Bỏ ProjectReference ở Host.API.csproj
|
|
19
|
+
- Bỏ ref ở Host.API trong appsettings
|
|
21
20
|
|
|
22
21
|
4. Mock Data
|
|
23
22
|
- Tools → NuGet Package Manager → Package Manager Console
|
|
@@ -27,5 +26,4 @@ How to make a blueprint
|
|
|
27
26
|
- Update-Database
|
|
28
27
|
|
|
29
28
|
5. Todos
|
|
30
|
-
- Plug/ Unplug module (config)
|
|
31
29
|
- Plug/ Unplug database provider (config)
|