diff --git a/Cnblogs.Architecture.sln b/Cnblogs.Architecture.sln
index 2826a7b..520af13 100644
--- a/Cnblogs.Architecture.sln
+++ b/Cnblogs.Architecture.sln
@@ -62,6 +62,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cnblogs.Architecture.Ddd.In
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cnblogs.Architecture.Ddd.Infrastructure.FileProviders.AliyunOss", "src\Cnblogs.Architecture.Ddd.Infrastructure.FileProviders.AliyunOss\Cnblogs.Architecture.Ddd.Infrastructure.FileProviders.AliyunOss.csproj", "{9C76E136-1D79-408C-A17F-FD63632B00A9}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis", "src\Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis\Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis.csproj", "{1FF58B65-6C83-4F0C-909A-6606B4C754B8}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -94,6 +96,7 @@ Global
{73665E32-3D10-4F71-B893-4C65F36332D0} = {D3A6DF01-017E-4088-936C-B3791F41DF53}
{4BD98FBF-FB98-4172-B352-BB7BF8761FCB} = {D3A6DF01-017E-4088-936C-B3791F41DF53}
{9C76E136-1D79-408C-A17F-FD63632B00A9} = {D3A6DF01-017E-4088-936C-B3791F41DF53}
+ {1FF58B65-6C83-4F0C-909A-6606B4C754B8} = {D3A6DF01-017E-4088-936C-B3791F41DF53}
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{54D9D850-1CFC-485E-97FE-87F41C220523}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -200,5 +203,9 @@ Global
{9C76E136-1D79-408C-A17F-FD63632B00A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C76E136-1D79-408C-A17F-FD63632B00A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C76E136-1D79-408C-A17F-FD63632B00A9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1FF58B65-6C83-4F0C-909A-6606B4C754B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1FF58B65-6C83-4F0C-909A-6606B4C754B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1FF58B65-6C83-4F0C-909A-6606B4C754B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1FF58B65-6C83-4F0C-909A-6606B4C754B8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore.csproj b/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore.csproj
index f9e4092..f5b3a66 100644
--- a/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore.csproj
+++ b/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore.csproj
@@ -8,6 +8,7 @@
+
diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/CqrsRouteMapper.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/CqrsRouteMapper.cs
index ab233a3..2ab46a4 100644
--- a/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/CqrsRouteMapper.cs
+++ b/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/CqrsRouteMapper.cs
@@ -114,10 +114,10 @@ public static IEndpointConventionBuilder MapQuery(
string nullRouteParameterPattern = "-",
bool enableHead = false)
{
- var returnType = EnsureReturnTypeIsQuery(handler);
+ var (queryType, returnType) = EnsureReturnTypeIsQuery(handler);
if (mapNullableRouteParameters is MapNullableRouteParameter.Disable)
{
- return MapRoutes(route);
+ return MapRoutes(queryType, returnType, route);
}
if (string.IsNullOrWhiteSpace(nullRouteParameterPattern))
@@ -129,7 +129,7 @@ public static IEndpointConventionBuilder MapQuery(
var parsedRoute = RoutePatternFactory.Parse(route);
var context = new NullabilityInfoContext();
- var nullableRouteProperties = returnType.GetProperties()
+ var nullableRouteProperties = queryType.GetProperties()
.Where(
p => p.GetMethod != null
&& p.SetMethod != null
@@ -150,15 +150,24 @@ public static IEndpointConventionBuilder MapQuery(
var regex = new Regex("{" + x.Name + "[^}]*?}", RegexOptions.IgnoreCase);
return regex.Replace(r, nullRouteParameterPattern);
});
- MapRoutes(newRoute);
+ MapRoutes(queryType, returnType, newRoute);
}
- return MapRoutes(route);
+ return MapRoutes(queryType, returnType, route);
- IEndpointConventionBuilder MapRoutes(string r)
+ IEndpointConventionBuilder MapRoutes(Type query, Type queryFor, string r)
{
var endpoint = enableHead ? app.MapMethods(r, GetAndHeadMethods, handler) : app.MapGet(r, handler);
- return endpoint.AddEndpointFilter();
+ var builder = endpoint.AddEndpointFilter()
+ .Produces(200, queryFor)
+ .WithTags("Queries");
+ if (query.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IQuery<>)))
+ {
+ // may be null
+ builder.Produces(404, queryFor);
+ }
+
+ return builder;
}
}
@@ -220,7 +229,7 @@ public static IEndpointConventionBuilder MapCommand(
[StringSyntax("Route")] string route,
Delegate handler)
{
- var commandTypeName = EnsureReturnTypeIsCommand(handler).Name;
+ var commandTypeName = EnsureReturnTypeIsCommand(handler).CommandType.Name;
if (PostCommandPrefixes.Any(x => commandTypeName.StartsWith(x)))
{
return app.MapPostCommand(route, handler);
@@ -265,8 +274,11 @@ public static IEndpointConventionBuilder MapPostCommand(
[StringSyntax("Route")] string route,
Delegate handler)
{
- EnsureReturnTypeIsCommand(handler);
- return app.MapPost(route, handler).AddEndpointFilter();
+ var (commandType, responseType, errorType) = EnsureReturnTypeIsCommand(handler);
+ var builder = app.MapPost(route, handler)
+ .AddEndpointFilter()
+ .AddCommandOpenApiDescriptions(commandType, responseType, errorType);
+ return builder;
}
///
@@ -295,8 +307,9 @@ public static IEndpointConventionBuilder MapPutCommand(
[StringSyntax("Route")] string route,
Delegate handler)
{
- EnsureReturnTypeIsCommand(handler);
- return app.MapPut(route, handler).AddEndpointFilter();
+ var (commandType, responseType, errorType) = EnsureReturnTypeIsCommand(handler);
+ return app.MapPut(route, handler).AddEndpointFilter()
+ .AddCommandOpenApiDescriptions(commandType, responseType, errorType);
}
///
@@ -325,8 +338,9 @@ public static IEndpointConventionBuilder MapDeleteCommand(
[StringSyntax("Route")] string route,
Delegate handler)
{
- EnsureReturnTypeIsCommand(handler);
- return app.MapDelete(route, handler).AddEndpointFilter();
+ var (commandType, responseType, errorType) = EnsureReturnTypeIsCommand(handler);
+ return app.MapDelete(route, handler).AddEndpointFilter()
+ .AddCommandOpenApiDescriptions(commandType, responseType, errorType);
}
///
@@ -395,7 +409,7 @@ public static IEndpointRouteBuilder StopMappingPrefixToDelete(this IEndpointRout
return app;
}
- private static Type EnsureReturnTypeIsCommand(Delegate handler)
+ private static (Type CommandType, Type? ResponseType, Type ErrorType) EnsureReturnTypeIsCommand(Delegate handler)
{
var returnType = handler.Method.ReturnType;
if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(Task<>))
@@ -403,18 +417,24 @@ private static Type EnsureReturnTypeIsCommand(Delegate handler)
returnType = returnType.GenericTypeArguments.First();
}
- var isCommand = returnType.GetInterfaces().Where(x => x.IsGenericType)
- .Any(x => CommandTypes.Contains(x.GetGenericTypeDefinition()));
- if (isCommand == false)
+ var commandType = returnType.GetInterfaces().Where(x => x.IsGenericType)
+ .FirstOrDefault(x => CommandTypes.Contains(x.GetGenericTypeDefinition()));
+ if (commandType == null)
{
throw new ArgumentException(
"handler does not return command, check if delegate returns type that implements ICommand<> or ICommand<,>");
}
- return returnType;
+ Type?[] genericParams = commandType.GetGenericArguments();
+ if (genericParams.Length == 1)
+ {
+ genericParams = [null, genericParams[0]];
+ }
+
+ return (returnType, genericParams[0], genericParams[1]!);
}
- private static Type EnsureReturnTypeIsQuery(Delegate handler)
+ private static (Type, Type) EnsureReturnTypeIsQuery(Delegate handler)
{
var returnType = handler.Method.ReturnType;
if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(Task<>))
@@ -422,15 +442,15 @@ private static Type EnsureReturnTypeIsQuery(Delegate handler)
returnType = returnType.GenericTypeArguments.First();
}
- var isCommand = returnType.GetInterfaces().Where(x => x.IsGenericType)
- .Any(x => QueryTypes.Contains(x.GetGenericTypeDefinition()));
- if (isCommand == false)
+ var queryInterface = returnType.GetInterfaces().Where(x => x.IsGenericType)
+ .FirstOrDefault(x => QueryTypes.Contains(x.GetGenericTypeDefinition()));
+ if (queryInterface == null)
{
throw new ArgumentException(
"handler does not return query, check if delegate returns type that implements IQuery<>");
}
- return returnType;
+ return (returnType, queryInterface.GenericTypeArguments[0]);
}
private static List GetNotEmptySubsets(ICollection items)
@@ -446,4 +466,24 @@ private static List GetNotEmptySubsets(ICollection items)
return results;
}
+
+ private static RouteHandlerBuilder AddCommandOpenApiDescriptions(
+ this RouteHandlerBuilder builder,
+ Type commandType,
+ Type? responseType,
+ Type errorType)
+ {
+ var commandResponseType = responseType is null
+ ? typeof(CommandResponse<>).MakeGenericType(errorType)
+ : typeof(CommandResponse<,>).MakeGenericType(responseType, errorType);
+ builder.Produces(200, commandResponseType)
+ .Produces(400, commandResponseType)
+ .WithTags("Commands");
+ if (commandType.GetInterfaces().Any(i => i == typeof(ILockableRequest)))
+ {
+ builder.Produces(429);
+ }
+
+ return builder;
+ }
}
diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.SqlServer/Cnblogs.Architecture.Ddd.Cqrs.Dapper.SqlServer.csproj b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.SqlServer/Cnblogs.Architecture.Ddd.Cqrs.Dapper.SqlServer.csproj
index 3d96d02..3a66b38 100644
--- a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.SqlServer/Cnblogs.Architecture.Ddd.Cqrs.Dapper.SqlServer.csproj
+++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.SqlServer/Cnblogs.Architecture.Ddd.Cqrs.Dapper.SqlServer.csproj
@@ -11,7 +11,7 @@
-
+
diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent.csproj b/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent.csproj
index 53f1d17..968c4bc 100644
--- a/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent.csproj
+++ b/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent.csproj
@@ -9,7 +9,7 @@
-
+
diff --git a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/Cnblogs.Architecture.Ddd.Domain.Abstractions.csproj b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/Cnblogs.Architecture.Ddd.Domain.Abstractions.csproj
index fbed1df..46a8849 100644
--- a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/Cnblogs.Architecture.Ddd.Domain.Abstractions.csproj
+++ b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/Cnblogs.Architecture.Ddd.Domain.Abstractions.csproj
@@ -14,7 +14,7 @@
-
+
diff --git a/src/Cnblogs.Architecture.Ddd.EventBus.Dapr/EndPointExtensions.cs b/src/Cnblogs.Architecture.Ddd.EventBus.Dapr/EndPointExtensions.cs
index 6d9ea3a..fb3923f 100644
--- a/src/Cnblogs.Architecture.Ddd.EventBus.Dapr/EndPointExtensions.cs
+++ b/src/Cnblogs.Architecture.Ddd.EventBus.Dapr/EndPointExtensions.cs
@@ -1,6 +1,7 @@
using System.Reflection;
using Cnblogs.Architecture.Ddd.EventBus.Abstractions;
using Cnblogs.Architecture.Ddd.EventBus.Dapr;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
@@ -58,7 +59,8 @@ public static IEndpointRouteBuilder Subscribe(
builder
.MapPost(route, (TEvent receivedEvent, IEventBus eventBus) => eventBus.ReceiveAsync(receivedEvent))
- .WithTopic(DaprOptions.PubSubName, DaprUtils.GetDaprTopicName(appName));
+ .WithTopic(DaprOptions.PubSubName, DaprUtils.GetDaprTopicName(appName))
+ .WithTags("Subscriptions");
return builder;
}
diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis.csproj b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis.csproj
new file mode 100644
index 0000000..245d038
--- /dev/null
+++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis.csproj
@@ -0,0 +1,18 @@
+
+
+
+
+ Provides remote cache provider that implemented with Redis
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/Injectors.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/Injectors.cs
new file mode 100644
index 0000000..7b405cb
--- /dev/null
+++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/Injectors.cs
@@ -0,0 +1,80 @@
+using Cnblogs.Architecture.Ddd.Cqrs.Abstractions;
+using Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection;
+using Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Options;
+using StackExchange.Redis;
+
+// ReSharper disable once CheckNamespace
+namespace Microsoft.Extensions.DependencyInjection;
+
+///
+/// Injectors for redis cache provider.
+///
+public static class Injectors
+{
+ ///
+ /// Add redis cache as remote cache.
+ ///
+ /// The injector.
+ /// The root configuration.
+ /// The configuration section name for redis, defaults to Redis.
+ /// The optional configuration.
+ ///
+ public static CqrsInjector AddRedisCache(
+ this CqrsInjector injector,
+ IConfiguration configuration,
+ string sectionName = "Redis",
+ Action? configure = null)
+ {
+ return AddRedisCache(injector, configuration.GetSection(sectionName), configure);
+ }
+
+ ///
+ /// Add redis cache as remote cache.
+ ///
+ /// The injector.
+ /// The configuration section for redis.
+ /// The optional configuration.
+ ///
+ public static CqrsInjector AddRedisCache(
+ this CqrsInjector injector,
+ IConfigurationSection section,
+ Action? configure = null)
+ {
+ injector.Services.Configure(section);
+ return AddRedisCache(injector, configure);
+ }
+
+ ///
+ /// Add redis cache as remote cache.
+ ///
+ /// The injector.
+ /// The connection string.
+ /// Optional configuration for redis options.
+ /// The configure for cacheable request options.
+ ///
+ public static CqrsInjector AddRedisCache(
+ this CqrsInjector injector,
+ string connectionString,
+ Action? redisConfigure = null,
+ Action? configure = null)
+ {
+ var options = ConfigurationOptions.Parse(connectionString, true);
+ injector.Services.Configure(o =>
+ {
+ o.Configure = options;
+ redisConfigure?.Invoke(o);
+ });
+ return AddRedisCache(injector, configure);
+ }
+
+ private static CqrsInjector AddRedisCache(
+ this CqrsInjector injector,
+ Action? configure = null)
+ {
+ injector.Services.AddSingleton(
+ sp => ConnectionMultiplexer.Connect(sp.GetRequiredService>().Value.Configure));
+ return injector.AddRemoteQueryCache(configure);
+ }
+}
diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/RedisCacheProvider.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/RedisCacheProvider.cs
new file mode 100644
index 0000000..d17eae5
--- /dev/null
+++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/RedisCacheProvider.cs
@@ -0,0 +1,84 @@
+using System.Text.Json;
+using Cnblogs.Architecture.Ddd.Domain.Abstractions;
+using Cnblogs.Architecture.Ddd.Infrastructure.Abstractions;
+using Microsoft.Extensions.Options;
+using StackExchange.Redis;
+
+namespace Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis;
+
+///
+/// Remote cache provider implemented with Redis.
+///
+public class RedisCacheProvider
+ : IRemoteCacheProvider
+{
+ private readonly RedisOptions _options;
+ private readonly IDatabaseAsync _database;
+ private readonly IDateTimeProvider _dateTimeProvider;
+
+ ///
+ /// Remote cache provider implemented with Redis.
+ ///
+ /// The underlying multiplexer.
+ /// The options for this provider.
+ /// The datetime provider.
+ public RedisCacheProvider(
+ ConnectionMultiplexer multiplexer,
+ IOptions options,
+ IDateTimeProvider dateTimeProvider)
+ {
+ _dateTimeProvider = dateTimeProvider;
+ _options = options.Value;
+ _database = multiplexer.GetDatabase(_options.Database);
+ }
+
+ ///
+ public Task AddAsync(string cacheKey, TResult value)
+ {
+ return _database.StringSetAsync(GetCacheKey(cacheKey), Serialize(value));
+ }
+
+ ///
+ public Task AddAsync(string cacheKey, TimeSpan expires, TResult value)
+ {
+ return _database.StringSetAsync(GetCacheKey(cacheKey), Serialize(value), expires);
+ }
+
+ ///
+ public async Task?> GetAsync(string cacheKey)
+ {
+ var json = await _database.StringGetAsync(GetCacheKey(cacheKey));
+ if (json.IsNullOrEmpty)
+ {
+ return null;
+ }
+
+ return DeSerialize(json!);
+ }
+
+ ///
+ public Task RemoveAsync(string cacheKey)
+ {
+ return _database.KeyDeleteAsync(GetCacheKey(cacheKey));
+ }
+
+ ///
+ public Task UpdateAsync(string cacheKey, TResult value)
+ {
+ return AddAsync(cacheKey, value);
+ }
+
+ ///
+ public Task UpdateAsync(string cacheKey, TResult value, TimeSpan expires)
+ {
+ return AddAsync(cacheKey, expires, value);
+ }
+
+ private string GetCacheKey(string key) => $"{_options.Prefix}{key}";
+
+ private string Serialize(TResult result)
+ => JsonSerializer.Serialize(new CacheEntry(result, _dateTimeProvider.UnixSeconds()));
+
+ private static CacheEntry? DeSerialize(string json)
+ => JsonSerializer.Deserialize>(json);
+}
diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/RedisOptions.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/RedisOptions.cs
new file mode 100644
index 0000000..e021af3
--- /dev/null
+++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/RedisOptions.cs
@@ -0,0 +1,24 @@
+using StackExchange.Redis;
+
+namespace Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis;
+
+///
+/// Options for redis connection.
+///
+public class RedisOptions
+{
+ ///
+ /// Prefix for all redis keys.
+ ///
+ public string Prefix { get; set; } = "cache_";
+
+ ///
+ /// The number of database to use.
+ ///
+ public int Database { get; set; } = -1;
+
+ ///
+ /// The redis configuration, https://stackexchange.github.io/StackExchange.Redis/Configuration
+ ///
+ public ConfigurationOptions Configure { get; set; } = new();
+}
diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.EntityFramework/Cnblogs.Architecture.Ddd.Infrastructure.EntityFramework.csproj b/src/Cnblogs.Architecture.Ddd.Infrastructure.EntityFramework/Cnblogs.Architecture.Ddd.Infrastructure.EntityFramework.csproj
index 47f95bf..b02f255 100644
--- a/src/Cnblogs.Architecture.Ddd.Infrastructure.EntityFramework/Cnblogs.Architecture.Ddd.Infrastructure.EntityFramework.csproj
+++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.EntityFramework/Cnblogs.Architecture.Ddd.Infrastructure.EntityFramework.csproj
@@ -9,7 +9,7 @@
-
+
diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.MongoDb/Cnblogs.Architecture.Ddd.Infrastructure.MongoDb.csproj b/src/Cnblogs.Architecture.Ddd.Infrastructure.MongoDb/Cnblogs.Architecture.Ddd.Infrastructure.MongoDb.csproj
index fdc9bb2..fec8fe0 100644
--- a/src/Cnblogs.Architecture.Ddd.Infrastructure.MongoDb/Cnblogs.Architecture.Ddd.Infrastructure.MongoDb.csproj
+++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.MongoDb/Cnblogs.Architecture.Ddd.Infrastructure.MongoDb.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/test/Cnblogs.Architecture.IntegrationTestProject/Cnblogs.Architecture.IntegrationTestProject.csproj b/test/Cnblogs.Architecture.IntegrationTestProject/Cnblogs.Architecture.IntegrationTestProject.csproj
index 799840f..df9e4ca 100644
--- a/test/Cnblogs.Architecture.IntegrationTestProject/Cnblogs.Architecture.IntegrationTestProject.csproj
+++ b/test/Cnblogs.Architecture.IntegrationTestProject/Cnblogs.Architecture.IntegrationTestProject.csproj
@@ -1,7 +1,7 @@
-
+
diff --git a/test/Cnblogs.Architecture.IntegrationTestProject/Properties/launchSettings.json b/test/Cnblogs.Architecture.IntegrationTestProject/Properties/launchSettings.json
index 2b3e363..cc7ea7c 100644
--- a/test/Cnblogs.Architecture.IntegrationTestProject/Properties/launchSettings.json
+++ b/test/Cnblogs.Architecture.IntegrationTestProject/Properties/launchSettings.json
@@ -14,7 +14,7 @@
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
- "applicationUrl": "https://localhost:7200;http://localhost:5200",
+ "applicationUrl": "https://localhost:8200;http://localhost:5200",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
diff --git a/test/Cnblogs.Architecture.IntegrationTests/Cnblogs.Architecture.IntegrationTests.csproj b/test/Cnblogs.Architecture.IntegrationTests/Cnblogs.Architecture.IntegrationTests.csproj
index 2b6ad3f..8113384 100644
--- a/test/Cnblogs.Architecture.IntegrationTests/Cnblogs.Architecture.IntegrationTests.csproj
+++ b/test/Cnblogs.Architecture.IntegrationTests/Cnblogs.Architecture.IntegrationTests.csproj
@@ -1,10 +1,10 @@
-
-
-
-
+
+
+
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
diff --git a/test/Cnblogs.Architecture.UnitTests/Cnblogs.Architecture.UnitTests.csproj b/test/Cnblogs.Architecture.UnitTests/Cnblogs.Architecture.UnitTests.csproj
index 6db550f..2f923c1 100644
--- a/test/Cnblogs.Architecture.UnitTests/Cnblogs.Architecture.UnitTests.csproj
+++ b/test/Cnblogs.Architecture.UnitTests/Cnblogs.Architecture.UnitTests.csproj
@@ -1,10 +1,10 @@
-
-
-
-
+
+
+
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all