From 50e94c23d553af8a22aacadab044a4fc95b2b085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=88=E6=98=9F=E7=B9=81?= Date: Mon, 13 Feb 2023 12:55:08 +0800 Subject: [PATCH] feat: translate xml document of Cnblogs.Architecture.Ddd.Cqrs.Abstractions --- Cnblogs.Architecture.sln.DotSettings | 2 + Directory.Build.props | 2 + .../CacheBehavior.cs | 6 +- .../CacheableRequestBehavior.cs | 18 ++--- .../CacheableRequestOptions.cs | 8 +- ....Architecture.Ddd.Cqrs.Abstractions.csproj | 24 +++--- .../CommandResponse.cs | 78 ++++++++++--------- ...acheableRequest.cs => ICachableRequest.cs} | 22 +++--- .../ICommand.Generic.cs | 11 ++- .../ICommand.cs | 9 ++- .../ICommandHandler.Generic.cs | 8 +- .../ICommandHandler.cs | 6 +- .../IConfigurableLockableRequest.cs | 4 +- .../IDomainEventHandler.cs | 4 +- .../IListQuery.cs | 4 +- .../IListQueryHandler.cs | 6 +- .../ILockableRequest.cs | 6 +- .../ILockableResponse.cs | 6 +- .../IObjectResponse.cs | 6 +- .../IOrderedQuery.cs | 7 +- .../IPageableQuery.cs | 6 +- .../IPageableQueryHandler.cs | 6 +- .../IQuery.cs | 4 +- .../IQueryHandler.cs | 6 +- .../IValidatable.cs | 4 +- .../IValidationResponse.cs | 8 +- .../InvalidCacheRequest.cs | 7 +- .../InvalidCacheRequestHandler.cs | 12 +-- .../LockableRequestBehavior.cs | 12 +-- .../LoggingBehavior.cs | 10 +-- .../PageableQueryHandlerBase.cs | 52 ++++++------- .../ValidationBehavior.cs | 10 +-- .../ValidationError.cs | 6 +- .../CqrsInjector.cs | 6 +- src/Directory.Build.props | 10 +++ .../DaprTests.cs | 4 - .../Cqrs/Behaviors/CacheBehaviorTests.cs | 2 +- .../Cqrs/FakeObjects/FakeQuery.cs | 2 +- 38 files changed, 218 insertions(+), 186 deletions(-) create mode 100644 Cnblogs.Architecture.sln.DotSettings rename src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/{ICacheableRequest.cs => ICachableRequest.cs} (54%) diff --git a/Cnblogs.Architecture.sln.DotSettings b/Cnblogs.Architecture.sln.DotSettings new file mode 100644 index 0000000..67e92cc --- /dev/null +++ b/Cnblogs.Architecture.sln.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props index e324885..c4de60d 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -8,6 +8,8 @@ Cnblogs.Architecture https://github.com/cnblogs/Architecture MIT + https://github.com/cnblogs/Architecture + git diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheBehavior.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheBehavior.cs index ad01237..03e01b6 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheBehavior.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheBehavior.cs @@ -1,17 +1,17 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 缓存行为定义。 +/// Options for handing . /// public enum CacheBehavior { /// - /// 不存在时获取新的。 + /// Update cache after cache missed, this is the default behavior. /// UpdateCacheIfMiss = 1, /// - /// 不使用缓存。 + /// Do not cache this request. /// DisabledCache = 2 } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheableRequestBehavior.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheableRequestBehavior.cs index 9668ff0..63d9bca 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheableRequestBehavior.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheableRequestBehavior.cs @@ -9,12 +9,12 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 对实现了 的请求进行处理。 +/// Handler for . /// -/// 实现了 的请求。 -/// 请求的结果。 +/// Request that implements . +/// Cached result for . public class CacheableRequestBehavior : IPipelineBehavior - where TRequest : ICacheableRequest, IRequest + where TRequest : ICachableRequest, IRequest { private readonly IDateTimeProvider _dateTimeProvider; private readonly ILocalCacheProvider? _local; @@ -23,12 +23,12 @@ public class CacheableRequestBehavior : IPipelineBehavior> _logger; /// - /// 构建一个 。 + /// Create . /// - /// 缓存提供器。 - /// 时间提供器。 - /// 缓存配置项。 - /// 日志记录器。 + /// Cache providers. + /// Datetime provider. + /// Options for cache behavior. + /// logger. public CacheableRequestBehavior( IEnumerable providers, IDateTimeProvider dateTimeProvider, diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheableRequestOptions.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheableRequestOptions.cs index 8bb9332..c2bdf1c 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheableRequestOptions.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CacheableRequestOptions.cs @@ -1,22 +1,22 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 缓存配置。 +/// Options for handling . /// public class CacheableRequestOptions { /// - /// 如果获取失败抛出异常。 + /// Rethrow exception if getting cached result failed. /// public bool ThrowIfFailedOnGet { get; set; } /// - /// 如果更新失败则抛出异常。 + /// Rethrow exception if updating cache failed. /// public bool ThrowIfFailedOnUpdate { get; set; } /// - /// 如果清除缓存失败则抛出异常,可能被 中的 覆盖。 + /// Rethrow exception if removing cache failed, this option can be overriden by for specific type of request. /// public bool ThrowIfFailedOnRemove { get; set; } } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/Cnblogs.Architecture.Ddd.Cqrs.Abstractions.csproj b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/Cnblogs.Architecture.Ddd.Cqrs.Abstractions.csproj index ec87da7..dd748ab 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/Cnblogs.Architecture.Ddd.Cqrs.Abstractions.csproj +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/Cnblogs.Architecture.Ddd.Cqrs.Abstractions.csproj @@ -1,13 +1,19 @@ - - - - - - - - - + + + Provides building blocks to archive CQRS pattern, including ICommand, IQuery, IPageableQuery, etc. + + + + + + + + + + + + diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CommandResponse.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CommandResponse.cs index e67c1f5..c9e0528 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CommandResponse.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CommandResponse.cs @@ -3,23 +3,26 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 命令返回的结果。 +/// Response returned by . /// public abstract record CommandResponse : IValidationResponse, ILockableResponse { /// - /// 是否出现验证错误。 + /// Check if validation fails. /// public bool IsValidationError { get; init; } /// - /// 是否出现并发错误。 + /// Check if concurrent error happened. /// public bool IsConcurrentError { get; init; } /// - /// 错误信息。 + /// The error message returned by handler, return empty if no error or no error message. /// + /// + /// Do not rely on this property to determine if executed successful, use for this purpose. + /// public string ErrorMessage { get; init; } = string.Empty; /// @@ -29,30 +32,30 @@ public abstract record CommandResponse : IValidationResponse, ILockableResponse public bool LockAcquired { get; set; } /// - /// 执行是否成功。 + /// Check if command executed successfully. /// - /// + /// Return true if executed successfully, else return false. public virtual bool IsSuccess() { return IsValidationError == false && string.IsNullOrEmpty(ErrorMessage) && IsConcurrentError == false; } /// - /// 获取错误信息。 + /// Get error message. /// - /// + /// The error message, return if no error. public virtual string GetErrorMessage() => ErrorMessage; } /// -/// 命令返回的结果。 +/// Response returned by . /// -/// 错误枚举类型。 +/// The enumeration presenting errors. public record CommandResponse : CommandResponse where TError : Enumeration { /// - /// 构造一个 。 + /// Create a successful . /// public CommandResponse() { @@ -60,24 +63,24 @@ public CommandResponse() } /// - /// 构造一个 。 + /// Create a with given error. /// - /// 错误码。 + /// The error. public CommandResponse(TError errorCode) { ErrorCode = errorCode; } /// - /// 错误码。 + /// The error returned by handler, can be null if execution succeeded. /// public TError? ErrorCode { get; set; } /// - /// 构造一个代表命令执行失败的 + /// Create a failed with given error. /// - /// 错误码。 - /// 代表命令执行失败的 + /// The error. + /// A failed with given error. public static CommandResponse Fail(TError errorCode) { return new CommandResponse(errorCode); @@ -96,9 +99,9 @@ public override string GetErrorMessage() } /// - /// 构造一个代表命令执行成功的 。 + /// Create a successful . /// - /// 代表命令执行成功的 + /// A successful . public static CommandResponse Success() { return new CommandResponse(); @@ -106,67 +109,70 @@ public static CommandResponse Success() } /// -/// 命令返回的结果。 +/// Response returned by . /// -/// 命令执行成功时返回的结果类型。 -/// 错误类型。 +/// The model type been returned if execution completed without error. +/// The enumeration type representing errors. public record CommandResponse : CommandResponse, IObjectResponse where TError : Enumeration { /// - /// 构造一个 。 + /// Create a . /// public CommandResponse() { } /// - /// 构造一个 。 + /// Create a with given error. /// - /// 错误码。 + /// The error. public CommandResponse(TError errorCode) : base(errorCode) { } /// - /// 构造一个 。 + /// Create a with given model. /// - /// 命令返回结果。 + /// The execution result. private CommandResponse(TView response) { Response = response; } /// - /// 命令执行结果。 + /// The result been returned by command handler. /// + /// + /// This property can be null even if execution completed with no error. + /// public TView? Response { get; } /// - /// 构造一个代表执行失败的 。 + /// Create a with given error. /// - /// 错误码。 - /// + /// The error. + /// A with given error. public static new CommandResponse Fail(TError errorCode) { return new CommandResponse(errorCode); } /// - /// 构造一个代表执行成功的 。 + /// Create a with no result nor error. /// - /// 代表执行成功的 + /// The public static new CommandResponse Success() { return new CommandResponse(); } /// - /// 构造一个代表执行成功的 。 + /// Create a with given result. /// - /// 执行结果。 - /// + /// The model to return. + /// A with given result. public static CommandResponse Success(TView view) { return new CommandResponse(view); diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICacheableRequest.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICachableRequest.cs similarity index 54% rename from src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICacheableRequest.cs rename to src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICachableRequest.cs index 6a22cf5..65c03fd 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICacheableRequest.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICachableRequest.cs @@ -1,48 +1,48 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义可缓存的请求 +/// Definition for cachable request. /// -public interface ICacheableRequest +public interface ICachableRequest { /// - /// 本地缓存配置。 + /// Configuration for local cache provider. /// CacheBehavior LocalCacheBehavior { get; set; } /// - /// 远程缓存配置。 + /// Configuration for remote cache provider. /// CacheBehavior RemoteCacheBehavior { get; set; } /// - /// 本地缓存过期时间。 + /// The expire time for local cache. /// TimeSpan? LocalExpires { get; set; } /// - /// 远程缓存过期时间。 + /// The expire time for remote cache. /// TimeSpan? RemoteExpires { get; set; } /// - /// 获取缓存分组键,null 代表不分组。 + /// Generate key for cache group, return null for no group. /// /// string? CacheGroupKey(); /// - /// 获取缓存键。 + /// Generate cache key for each request. /// - /// + /// The cache key for current request. string CacheKey() { return string.Join('-', GetCacheKeyParameters().Select(p => p?.ToString()?.ToLower())); } /// - /// 获取组成缓存键的参数。 + /// Get parameters for generating cache key, will call to each object been provided. /// - /// + /// The parameter array. object?[] GetCacheKeyParameters(); } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommand.Generic.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommand.Generic.cs index a33dfd3..03ede81 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommand.Generic.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommand.Generic.cs @@ -5,15 +5,18 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义 CQRS 中的命令相关的行为。 +/// Definitions of command in CQRS. /// -/// 命令执行成功时返回的结果。 -/// 命令失败时返回的错误码类型。 +/// The result type for command. +/// The error code type when command failed. public interface ICommand : IRequest> where TError : Enumeration { /// - /// 命令是否只进行验证。 + /// Only execute validation logic. /// + /// + /// This logic must be implemented manually in command handler and not guaranteed by framework. + /// public bool ValidateOnly { get; } } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommand.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommand.cs index d26aa85..fe5f0c3 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommand.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommand.cs @@ -5,14 +5,17 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义 CQRS 中的命令相关的行为。 +/// Definition for command. /// -/// 命令失败时返回的错误码类型。 +/// The error type when command execution failed. public interface ICommand : IRequest> where TError : Enumeration { /// - /// 命令是否只执行验证。 + /// Only execute validation logic. /// + /// + /// This logic must be implemented manually in command handler and not guaranteed by framework. + /// public bool ValidateOnly { get; } } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommandHandler.Generic.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommandHandler.Generic.cs index 4017321..0cb6fa8 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommandHandler.Generic.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommandHandler.Generic.cs @@ -5,11 +5,11 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义 的实际处理逻辑。 +/// Definitions of handler that handles 。 /// -/// 该 Handler 能够处理的命令类型。 -/// 命令返回的结果类型。 -/// 该 Handler 返回的错误码类型。 +/// The command type for this handler. +/// The result type for this handler. +/// The error type for this handler. public interface ICommandHandler : IRequestHandler> where TCommand : ICommand where TError : Enumeration diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommandHandler.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommandHandler.cs index a18f28e..3212703 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommandHandler.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ICommandHandler.cs @@ -5,10 +5,10 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义 的实际处理逻辑。 +/// Definitions of handler that handles . /// -/// 该 Handler 能够处理的命令类型。 -/// 该 Handler 返回的错误码类型。 +/// The command type for this handler. +/// The error type for this handler. public interface ICommandHandler : IRequestHandler> where TCommand : ICommand where TError : Enumeration diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IConfigurableLockableRequest.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IConfigurableLockableRequest.cs index 5e4e8a8..0d4bbf9 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IConfigurableLockableRequest.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IConfigurableLockableRequest.cs @@ -1,12 +1,12 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 可配置的分布式锁请求。 +/// Definitions of a with some configurations. /// public interface IConfigurableLockableRequest : ILockableRequest { /// - /// 锁过期时间。 + /// The maximum waiting time for requiring a lock. /// TimeSpan ExpiresIn { get; } } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IDomainEventHandler.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IDomainEventHandler.cs index 4722e78..47a0f9c 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IDomainEventHandler.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IDomainEventHandler.cs @@ -5,9 +5,9 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 领域事件处理器。 +/// Definitions of handler for . /// -/// 要订阅的领域事件。 +/// The domain event type for this handler to handle. public interface IDomainEventHandler : INotificationHandler where TDomainEvent : DomainEvent { diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IListQuery.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IListQuery.cs index 2a9882a..834b4b2 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IListQuery.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IListQuery.cs @@ -3,9 +3,9 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义返回多个结果的查询。 +/// Represents a query returns a list of items. /// -/// 查询结果类型,通常是一个列表类型。 +/// The list to return, usually a . public interface IListQuery : IRequest { } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IListQueryHandler.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IListQueryHandler.cs index 55cc1f7..981b608 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IListQueryHandler.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IListQueryHandler.cs @@ -3,10 +3,10 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义 的处理逻辑。 +/// Represents a handler for . /// -/// 该 Handler 能够处理的 类型。 -/// 查询结果类型。 +/// The been handled. +/// The result type of . public interface IListQueryHandler : IRequestHandler where TQuery : IListQuery { diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ILockableRequest.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ILockableRequest.cs index aebc2e4..f100b05 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ILockableRequest.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ILockableRequest.cs @@ -1,13 +1,13 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义需要分布式锁的请求 +/// Represents a request that needs distributed locks. /// public interface ILockableRequest { /// - /// 获取锁的 Key。 + /// Get the key of distributed lock. /// - /// + /// The key of distributed lock. string GetLockKey(); } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ILockableResponse.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ILockableResponse.cs index ffaefd2..ea46f6e 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ILockableResponse.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ILockableResponse.cs @@ -1,17 +1,17 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 使用分布式锁后的响应。 +/// Represents response for . /// public interface ILockableResponse { /// - /// 是否出现并发错误(获取不到锁) + /// Indicates whether lock was required successfully. /// bool IsConcurrentError { get; init; } /// - /// 是否成功获取到锁。 + /// Indicates whether lock was required. /// bool LockAcquired { get; set; } } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IObjectResponse.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IObjectResponse.cs index ebb5cdc..977e027 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IObjectResponse.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IObjectResponse.cs @@ -1,13 +1,13 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 包含结果对象的响应。 +/// Represents response that contains object result. /// public interface IObjectResponse { /// - /// 获取结果。 + /// Get object result. /// - /// 结果。 + /// The resulting object. public object? GetResult(); } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IOrderedQuery.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IOrderedQuery.cs index ae81c9c..d017d68 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IOrderedQuery.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IOrderedQuery.cs @@ -1,13 +1,14 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义返回已排序的多个结果的查询。 +/// Represents a with ordered results. /// -/// 查询结果类型,通常是列表类型。 +/// The querying type, usually a list type. public interface IOrderedQuery : IListQuery { /// - /// 排序字符串。 + /// The string indicates the order. /// + /// Order by string can be like "-dateadded"(order by dateadded desc) or "id"(order by id asc). string? OrderByString { get; } } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IPageableQuery.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IPageableQuery.cs index e057140..6a2c88b 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IPageableQuery.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IPageableQuery.cs @@ -3,13 +3,13 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义返回分页结果的查询类型。 +/// Represents a with paged results. /// -/// 单个查询结果的类型。 +/// The type for each item in results. public interface IPageableQuery : IOrderedQuery> { /// - /// 分页参数。 + /// The paging parameters, include page index and page size. /// PagingParams? PagingParams { get; } } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IPageableQueryHandler.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IPageableQueryHandler.cs index 5f5f154..a3dd8ed 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IPageableQueryHandler.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IPageableQueryHandler.cs @@ -3,10 +3,10 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义处理分页查询的逻辑。 +/// Represents the handler for . /// -/// 查询类型,需要继承 -/// 单个查询结果类型,将返回 IPagedList<TView>。 +/// The to handle. +/// The type for each item in . public interface IPageableQueryHandler : IListQueryHandler> where TQuery : IPageableQuery { diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IQuery.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IQuery.cs index 1ba6434..a61323a 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IQuery.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IQuery.cs @@ -3,9 +3,9 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义获取单个结果的查询。 +/// Represents query for single item. /// -/// 结果类型。 +/// The type of item to query. public interface IQuery : IRequest { } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IQueryHandler.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IQueryHandler.cs index 2b6ea41..8a17091 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IQueryHandler.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IQueryHandler.cs @@ -3,10 +3,10 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义处理 的逻辑。 +/// Represents handler that handles . /// -/// 查询类型,需要继承 -/// 结果类型。 +/// The type to handle. +/// The type of item to query. public interface IQueryHandler : IRequestHandler where TQuery : IQuery { diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IValidatable.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IValidatable.cs index af66da1..98695be 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IValidatable.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IValidatable.cs @@ -1,12 +1,12 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 定义可验证的类型。 +/// Represents a request that can be validated. /// public interface IValidatable { /// - /// 验证方法,出错时返回 ,否则返回 null。 + /// Validate the object, return if fails or null if passed. /// ValidationError? Validate(); } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IValidationResponse.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IValidationResponse.cs index 2b1bb37..f29ad32 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IValidationResponse.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/IValidationResponse.cs @@ -1,22 +1,22 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 的返回类型。 +/// Represents response for . /// public interface IValidationResponse { /// - /// 验证是否失败。 + /// Indicates whether validation is failed. /// bool IsValidationError { get; init; } /// - /// 错误信息。 + /// Contain error message if validation fails. /// string ErrorMessage { get; init; } /// - /// 错误信息对象。 + /// The validation results, null if validation was passed. /// ValidationError? ValidationError { get; init; } } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/InvalidCacheRequest.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/InvalidCacheRequest.cs index 1b89624..e7037d7 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/InvalidCacheRequest.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/InvalidCacheRequest.cs @@ -3,9 +3,12 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 清除缓存请求。 +/// Represents request to invalid caches. /// +/// The request that been cached. +/// Invalid cache for the group that was in. +/// Throw exceptions if fails, overrides same options in . public record InvalidCacheRequest( - ICacheableRequest Request, + ICachableRequest Request, bool InvalidWholeGroup = false, bool? ThrowIfFailed = null) : IRequest; \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/InvalidCacheRequestHandler.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/InvalidCacheRequestHandler.cs index dd963ed..2e12696 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/InvalidCacheRequestHandler.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/InvalidCacheRequestHandler.cs @@ -9,7 +9,7 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 清除缓存。 +/// The default handler for . /// public class InvalidCacheRequestHandler : IRequestHandler { @@ -20,12 +20,12 @@ public class InvalidCacheRequestHandler : IRequestHandler private readonly ILogger _logger; /// - /// 构建一个 。 + /// Create a . /// - /// 缓存提供器。 - /// 时间提供器。 - /// 缓存配置。 - /// 日志记录器。 + /// Cache providers. + /// Datetime providers. + /// Cache options. + /// log provider. public InvalidCacheRequestHandler( IEnumerable providers, IDateTimeProvider dateTimeProvider, diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/LockableRequestBehavior.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/LockableRequestBehavior.cs index f041178..0662600 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/LockableRequestBehavior.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/LockableRequestBehavior.cs @@ -7,10 +7,10 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 处理需要分布式锁的请求。 +/// Handle requests that require distributed lock. /// -/// 请求类型。 -/// 响应类型。 +/// The type of request. +/// The type of response. public class LockableRequestBehavior : IPipelineBehavior where TRequest : ILockableRequest, IRequest where TResponse : ILockableResponse, new() @@ -19,10 +19,10 @@ public class LockableRequestBehavior : IPipelineBehavior> _logger; /// - /// 创建一个新的 实例。 + /// Create a new instance. /// - /// 分布式锁提供器。 - /// 日志记录器。 + /// Distributed lock provider. + /// log provider. public LockableRequestBehavior( IDistributedLockProvider distributedLockProvider, ILogger> logger) diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/LoggingBehavior.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/LoggingBehavior.cs index 14de343..1ff65d5 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/LoggingBehavior.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/LoggingBehavior.cs @@ -5,19 +5,19 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 记录命令/查询日志 +/// Middleware for logging requests and events. /// -/// 请求类型。 -/// 返回类型。 +/// The type of request. +/// The type of response. public class LoggingBehavior : IPipelineBehavior where TRequest : IRequest { private readonly ILogger> _logger; /// - /// 新建一个 类型的实例。 + /// Create a new instance. /// - /// 日志记录器。 + /// Log provider. public LoggingBehavior(ILogger> logger) { _logger = logger; diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/PageableQueryHandlerBase.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/PageableQueryHandlerBase.cs index da0e68c..a6bf8a0 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/PageableQueryHandlerBase.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/PageableQueryHandlerBase.cs @@ -5,11 +5,11 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 用于实现 的基类。 +/// Base class for implementing . /// -/// 查询类型。 -/// 实体类型。 -/// 返回类型。 +/// The type of query. +/// The type of entity to query. +/// The type of projected view model. public abstract class PageableQueryHandlerBase : IPageableQueryHandler where TQuery : IPageableQuery { @@ -45,54 +45,54 @@ public async Task> Handle(TQuery request, CancellationToken can } /// - /// 获取总数的查询。 + /// Query for total count. /// - /// 查询条件。 - /// 过滤好的 。 - /// 总数。 + /// The query parameters. + /// Filtered . + /// The total count of items. protected abstract Task CountAsync(TQuery query, IQueryable queryable); /// - /// 默认的排序条件,如果没有指定 ,将会使用这一语句。 + /// The default order by field, used when is not present. /// - /// 查询条件。 - /// 返回的。 - /// 排序好的 + /// The query parameters. + /// returned by . + /// Ordered . protected abstract IQueryable DefaultOrderBy(TQuery query, IQueryable queryable); /// - /// 获取并过滤,返回 + /// Create queryable and apply filter, return filtered . /// - /// 输入的查询条件。 - /// 过滤后的 + /// The query parameter. + /// Filtered . protected abstract IQueryable Filter(TQuery query); /// - /// 获取并过滤,返回 + /// Create queryable and apply filter asynchronously, return filtered . /// - /// 输入的查询条件。 - /// 过滤后的 + /// The query parameter. + /// Filtered . protected virtual Task> FilterAsync(TQuery query) { return Task.FromResult(Filter(query)); } /// - /// 投射结果,返回 。 + /// Project item to view model, return projected . /// - /// 查询条件。 - /// 过滤并排序完成的 。 - /// 投射好的 + /// The query parameter. + /// Filtered and ordered . + /// Projected . protected virtual IQueryable ProjectToView(TQuery query, IQueryable queryable) { return queryable.ProjectToType(); } /// - /// 执行实际的查询。 + /// Execute query and projections, get the actual results. /// - /// 查询条件。 - /// 投射好的 - /// 查询结果。 + /// The query parameter. + /// Projected . + /// The query result. protected abstract Task> ToListAsync(TQuery query, IQueryable queryable); } \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationBehavior.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationBehavior.cs index 2ab3998..ac5760c 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationBehavior.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationBehavior.cs @@ -5,10 +5,10 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 对实现了 进行验证。 +/// Validate requests that implements . /// -/// 请求类型。 -/// 结果类型。 +/// The type of request. +/// The type of response. public class ValidationBehavior : IPipelineBehavior where TRequest : IValidatable, IRequest where TResponse : IValidationResponse, new() @@ -16,9 +16,9 @@ public class ValidationBehavior : IPipelineBehavior> _logger; /// - /// 构造一个 。 + /// Create a new . /// - /// + /// The log provider. public ValidationBehavior(ILogger> logger) { _logger = logger; diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationError.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationError.cs index 37df214..6ba218b 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationError.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationError.cs @@ -1,8 +1,8 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// -/// 验证错误。 +/// A Validation error returned by . /// -/// 错误信息。 -/// 参数名称。 +/// The error message. +/// The parameter name that failed to validate. public record ValidationError(string Message, string? ParameterName); \ No newline at end of file diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection/CqrsInjector.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection/CqrsInjector.cs index 1e6ad67..0339bd5 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection/CqrsInjector.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection/CqrsInjector.cs @@ -65,7 +65,7 @@ public CqrsInjector AddDistributionLock() } /// - /// 启用缓存中间件,自动处理和缓存实现了 接口的请求。 + /// 启用缓存中间件,自动处理和缓存实现了 接口的请求。 /// /// 本地缓存提供器。 /// 缓存配置。 @@ -79,7 +79,7 @@ public CqrsInjector AddLocalQueryCache(Action? } /// - /// 启用缓存中间件,自动处理和缓存实现了 接口的请求。 + /// 启用缓存中间件,自动处理和缓存实现了 接口的请求。 /// /// 本地缓存提供器。 /// 远程缓存提供器。 @@ -96,7 +96,7 @@ public CqrsInjector AddQueryCache(Action - /// 启用缓存中间件,自动处理和缓存实现了 接口的请求。 + /// 启用缓存中间件,自动处理和缓存实现了 接口的请求。 /// /// 远程缓存提供器。 /// 缓存配置。 diff --git a/src/Directory.Build.props b/src/Directory.Build.props index ac09a8e..4f3a0f4 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -4,6 +4,16 @@ true + true + true + snupkg + + Please check release notes at: https://github.com/cnblogs/Architecture/releases + + + + + diff --git a/test/Cnblogs.Architecture.IntegrationTests/DaprTests.cs b/test/Cnblogs.Architecture.IntegrationTests/DaprTests.cs index d500b30..fbbce30 100644 --- a/test/Cnblogs.Architecture.IntegrationTests/DaprTests.cs +++ b/test/Cnblogs.Architecture.IntegrationTests/DaprTests.cs @@ -10,10 +10,6 @@ namespace Cnblogs.Architecture.IntegrationTests; public class DaprTests { - public DaprTests() - { - } - [Fact] public async Task Dapr_SubscribeEndpoint_OkAsync() { diff --git a/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/CacheBehaviorTests.cs b/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/CacheBehaviorTests.cs index 1a5b5db..a80151c 100644 --- a/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/CacheBehaviorTests.cs +++ b/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/CacheBehaviorTests.cs @@ -251,7 +251,7 @@ public void CacheBehavior_NoProvider_Throw() private static CacheableRequestBehavior GetBehavior( List providers, Action? optionConfigure = null) - where TRequest : ICacheableRequest, IRequest + where TRequest : ICachableRequest, IRequest { var option = new CacheableRequestOptions(); optionConfigure?.Invoke(option); diff --git a/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeQuery.cs b/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeQuery.cs index e6fefc9..cb329df 100644 --- a/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeQuery.cs +++ b/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeQuery.cs @@ -4,7 +4,7 @@ namespace Cnblogs.Architecture.UnitTests.Cqrs.FakeObjects; -public class FakeQuery : ICacheableRequest, IRequest, IValidatable +public class FakeQuery : ICachableRequest, IRequest, IValidatable { private readonly string? _cacheGroupKey; private readonly string _cacheKey;