using MediatR; using FluentValidation; using Fengling.Member.Domain.Aggregates.Users; using Fengling.Member.Infrastructure.Repositories; namespace Fengling.Member.Application.Commands.Member; public class BindWechatCommand : IRequest { public long MemberId { get; set; } public string OpenId { get; set; } = string.Empty; public string? UnionId { get; set; } } public class BindWechatResponse { public long MemberId { get; set; } public string OpenId { get; set; } = string.Empty; public string? UnionId { get; set; } public DateTime BoundAt { get; set; } } public class BindWechatCommandValidator : AbstractValidator { public BindWechatCommandValidator() { RuleFor(x => x.MemberId).GreaterThan(0); RuleFor(x => x.OpenId).NotEmpty().MaximumLength(64); RuleFor(x => x.UnionId).MaximumLength(64); } } public class BindWechatCommandHandler : IRequestHandler { private readonly IMemberRepository _memberRepository; private readonly ILogger _logger; public BindWechatCommandHandler( IMemberRepository memberRepository, ILogger logger) { _memberRepository = memberRepository; _logger = logger; } public async Task Handle(BindWechatCommand request, CancellationToken cancellationToken) { _logger.LogInformation("Binding wechat for member {MemberId}", request.MemberId); var member = await _memberRepository.GetAsync(request.MemberId, cancellationToken); if (member == null) { throw new KeyNotFoundException($"会员不存在: {request.MemberId}"); } member.BindWechat(request.OpenId, request.UnionId); _logger.LogInformation("Wechat bound successfully for member {MemberId}", request.MemberId); return new BindWechatResponse { MemberId = member.Id, OpenId = request.OpenId, UnionId = request.UnionId, BoundAt = DateTime.UtcNow }; } }