Cursor rule
.cursor/rules/service.mdcCodeSpirit 服务类开发规范 - 服务接口、实现、生命周期和依赖注入
Cursor rules
Quality
50/100
Scores the file, not the repository.Length
245 words
6 headings · 2 code blocksRepository
56
— · pushed 134 days agoLast changed
3 days ago
First indexed 3 days ago.123456789# 服务(Service)类规则1011## 基本要求12131. 确保服务类实现正确的接口和基类142. 添加构造函数注释和 XML 文档注释153. 服务类必须实现 [BaseCRUDIService.cs](mdc:Src/CodeSpirit.Shared/Services/BaseCRUDIService.cs) 或 [BaseCRUDService.cs](mdc:Src/CodeSpirit.Shared/Services/BaseCRUDService.cs),应实现常见的查询逻辑164. 服务接口必须实现 [IBaseCRUDIService.cs](mdc:Src/CodeSpirit.Shared/Services/IBaseCRUDIService.cs) 或 [IBaseCRUDService.cs](mdc:Src/CodeSpirit.Shared/Services/IBaseCRUDService.cs)175. 服务类必须实现生命周期标记接口(IScopedDependency / ITransientDependency / ISingletonDependency)1819## 服务类示例2021```csharp22/// <summary>23/// 用户服务接口24/// </summary>25public interface IUserService : IBaseCRUDService<User, long, CreateUserDto, UpdateUserDto, UserQueryDto>26{27 /// <summary>28 /// 根据用户名获取用户29 /// </summary>30 /// <param name="username">用户名</param>31 /// <returns>用户信息</returns>32 Task<UserDto> GetByUsernameAsync(string username);33}3435/// <summary>36/// 用户服务实现37/// </summary>38public class UserService : BaseCRUDService<User, long, CreateUserDto, UpdateUserDto, UserQueryDto>,39 IUserService, IScopedDependency40{41 /// <summary>42 /// 初始化用户服务43 /// </summary>44 /// <param name="repository">用户仓储</param>45 /// <param name="mapper">对象映射器</param>46 public UserService(IRepository<User> repository, IMapper mapper)47 : base(repository, mapper)48 {49 }5051 public async Task<UserDto> GetByUsernameAsync(string username)52 {53 // 实现逻辑54 }55}56```5758## 生命周期选择5960- **IScopedDependency**: Scoped 生命周期(推荐大多数业务服务)61- **ITransientDependency**: Transient 生命周期(推荐无状态工具类)62- **ISingletonDependency**: Singleton 生命周期(推荐配置和缓存服务)6364## 设置服务最佳实践6566使用 `ISettingsService` 时,推荐使用 `[SettingsDto]` 特性简化 API 调用:6768```csharp69// 1. 定义设置 DTO 并添加特性70using CodeSpirit.Settings.Attributes;7172[SettingsDto("ThirdPartyLogin", "WeChat")]73public class WeChatLoginSettingsDto74{75 public string AppId { get; set; } = string.Empty;76 public string AppSecret { get; set; } = string.Empty;77}7879// 2. 在服务中使用简化 API(无需手动传入 module/key)80public class AuthService : IScopedDependency81{82 private readonly ISettingsService _settingsService;8384 public async Task<WeChatLoginSettingsDto> GetWeChatConfigAsync(string tenantId)85 {86 // 简化版 API:自动从 DTO 特性获取 module/key87 return await _settingsService.GetTenantSettingAsync<WeChatLoginSettingsDto>(tenantId)88 ?? new WeChatLoginSettingsDto();89 }9091 public async Task SaveWeChatConfigAsync(WeChatLoginSettingsDto dto, string tenantId)92 {93 // 简化版 API:自动从 DTO 特性获取 module/key94 await _settingsService.SetTenantSettingAsync(dto, tenantId, "更新微信配置");95 }96}97```9899**优势:**100- 类型安全,编译时检查101- 避免模块名/配置键字符串不一致102- 配置键集中管理,修改只需改一处103- 反射结果自动缓存,性能优化104105## 参考文件106107- 服务基类: [BaseCRUDService.cs](mdc:Src/CodeSpirit.Shared/Services/BaseCRUDService.cs)108- 服务接口: [IBaseCRUDService.cs](mdc:Src/CodeSpirit.Shared/Services/IBaseCRUDService.cs)109- 依赖注入规范: [dependency-injection.mdc](mdc:.cursor/rules/dependency-injection.mdc)110- 设置组件文档: [codespirit-settings-guide-zh-CN.md](mdc:Docs/03-Core-Components/codespirit-settings-guide-zh-CN.md)111
Also in xin-lai/CodeSpirit
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| xin-lai/CodeSpirit.cursor/rules/js.mdc · 56 | Cursor rules | apidocs | 46/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/ai-development.mdc · 56 | Cursor rules | api | 46/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/all.mdc · 56 | Cursor rules | testing-strategyapi | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/amis-cards.mdc · 56 | Cursor rules | no sections | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/api-design.mdc · 56 | Cursor rules | no sections | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/controller.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/cs.mdc · 56 | Cursor rules | no sections | 25/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/csproj.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/css.mdc · 56 | Cursor rules | ui | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/database.mdc · 56 | Cursor rules | no sections | 74/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/dependency-injection.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/dto.mdc · 56 | Cursor rules | no sections | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/enum.mdc · 56 | Cursor rules | no sections | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/i18n.mdc · 56 | Cursor rules | no sections | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/naming-conventions.mdc · 56 | Cursor rules | no sections | 50/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/package-management.mdc · 56 | Cursor rules | no sections | 74/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/performance.mdc · 56 | Cursor rules | no sections | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/project-structure.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/security.mdc · 56 | Cursor rules | database | 54/100 | 3 days ago | |
| xin-lai/CodeSpirit.cursor/rules/startup-framework.mdc · 56 | Cursor rules | api | 54/100 | 3 days ago |
Diff against .cursor/rules/js.mdc Diff against .cursor/rules/ai-development.mdc Diff against .cursor/rules/all.mdc Diff against .cursor/rules/amis-cards.mdc Diff against .cursor/rules/api-design.mdc Diff against .cursor/rules/controller.mdc Diff against .cursor/rules/cs.mdc Diff against .cursor/rules/csproj.mdc Diff against .cursor/rules/css.mdc Diff against .cursor/rules/database.mdc Diff against .cursor/rules/dependency-injection.mdc Diff against .cursor/rules/dto.mdc Diff against .cursor/rules/enum.mdc Diff against .cursor/rules/i18n.mdc Diff against .cursor/rules/naming-conventions.mdc Diff against .cursor/rules/package-management.mdc Diff against .cursor/rules/performance.mdc Diff against .cursor/rules/project-structure.mdc Diff against .cursor/rules/security.mdc Diff against .cursor/rules/startup-framework.mdc
Similar configs
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126 | Cursor rules | setupbuildtestlint-format+6 | 100/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45 | Cursor rules | testlint-formatstylearch+5 | 100/100 | 3 days ago | |
| markstev/mark-starter.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+6 | 99/100 | 3 days ago | |
| Allymahmoud/case-intake-platform.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| deifos/clipmira-subtitles.cursor/rules/frontend.mdc · 1 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| dodgecfr/combatfilms-webapp.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| langflow-ai/langflow.cursor/rules/docs_development.mdc · 153k | Cursor rules | setupbuildtestlint-format+7 | 97/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45 | Cursor rules | teststyletesting-strategysecurity+3 | 97/100 | 3 days ago |
