news 2026/8/28 14:53:03

Czar.Cms配置文件与AutoFac依赖注入实战:如何构建自动扫描整个程序集的DI容器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Czar.Cms配置文件与AutoFac依赖注入实战:如何构建自动扫描整个程序集的DI容器

Czar.Cms配置文件与AutoFac依赖注入实战:如何构建自动扫描整个程序集的DI容器

【免费下载链接】Czar.Cms.NET Core实战项目之CMS系列教程的源码,精简而又功能丰富的权限设计,内容管理设计让你轻松搭建一个ASP.NET Core2.2的网站系统.此项目准备用EFCore进行重构,敬请期待项目地址: https://gitcode.com/gh_mirrors/cz/Czar.Cms

Czar.Cms 是一个精简而功能丰富的 .NET Core CMS 系统源码,内置权限管理、内容管理与定时任务。本文带你实战解析 Czar.Cms 的配置文件体系与 AutoFac 依赖注入玩法:从 appsettings.json 读取数据库配置,到用几行代码构建一个自动扫描整个程序集的 DI 容器,让 Repository 与 Service 层"零手动注册"。

🧭 项目一览:Czar.Cms 的分层结构

Czar.Cms 采用经典的分层架构,整个解决方案位于src/目录,各层职责清晰:

项目职责
Czar.Cms.Admin后台管理站点(MVC + 配置入口)
Czar.Cms.Core基础设施:连接工厂、缓存、帮助类
Czar.Cms.Models / ViewModels实体模型与视图模型
Czar.Cms.IRepository / IServices仓储层、业务层的接口
Czar.Cms.Repository.SqlServer / Services仓储层、业务层的实现
Czar.Cms.Quartz / Job定时任务调度中心与任务

💡 正是靠下面要讲的配置文件 + AutoFac 容器,各层才能在Startup.cs启动时"即插即用",最终渲染出这个后台登录页。

📄 配置文件实战:连接串到底放在哪

1. 核心配置都在 appsettings.json

Czar.Cms 的 Web 配置入口是 appsettings.json,数据库相关配置集中在DbOpion节中:

"DbOpion": { "ConnectionString": "Data Source=.;Initial Catalog=CzarCms;User ID=sa;Password=1;...", "DbType": "SqlServer" }

开发环境则通过 appsettings.Development.json 覆盖日志级别——ASP.NET Core 会按"环境合并"策略自动叠加两个文件,你只需要改对应环境的文件即可,互不干扰。

2. 配置绑定成强类型选项类

裸读字符串不如绑定成类。Czar.Cms 在 DbOption.cs 中定义了只有ConnectionStringDbType两个属性的选项类,然后在 Startup.cs 中一行完成绑定:

services.Configure<DbOption>("CzarCms", Configuration.GetSection("DbOpion"));

注意这里多了一个选项名"CzarCms",配合IOptionsSnapshot<DbOption>options.Get("CzarCms")使用,意味着同一应用可以绑定多份不同来源的配置,互不串扰。

3. 日志配置独立成 Nlog.config

日志由 NLog 负责,规则写在 Nlog.config 中:Czar.Cms.*命名空间下的日志写入数据库NLog表,而Microsoft.*的框架日志全部"扔进黑洞"。该文件通过 csproj 中的CopyToOutputDirectory配置保证发布时随站点一起输出。

🚀 AutoFac 构建 DI 容器:四步法自动扫描程序集

C# 依赖注入的精髓是"面向接口编程 + 运行时装配"。Czar.Cms 没有用框架默认的AddScoped逐个注册,而是引入 AutoFac,用类型命名约定一次性装配整个程序集。核心代码在 Startup.cs:

var builder = new ContainerBuilder(); builder.Populate(services); // 第1步:把 Microsoft DI 的服务"搬"进 AutoFac builder.RegisterAssemblyTypes(typeof(ManagerRoleRepository).Assembly) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces(); // 第2步:扫描仓储层程序集 builder.RegisterAssemblyTypes(typeof(ManagerRoleService).Assembly) .Where(t => t.Name.EndsWith("Service")) .AsImplementedInterfaces(); // 第3步:扫描业务层程序集 return new AutofacServiceProvider(builder.Build()); // 第4步:接管服务提供

四步法拆解如下:

步骤代码作用
Populate(services)合并容器前面AddMvcAddSession等注册的服务对 AutoFac 可见
RegisterAssemblyTypes(...)自动扫描反射遍历整个程序集里的所有类型
.Where(...).AsImplementedInterfaces()约定注册只要类名以约定后缀结尾,就按它实现的接口注册
AutofacServiceProvider接管整个应用从此由 AutoFac 统一解析实例

🧩 约定大于配置:命名即注册

这套玩法的"钥匙"是命名约定——类名必须以 Repository 或 Service 结尾。例如 ManagerRoleRepository.cs 中:

public class ManagerRoleRepository : BaseRepository<ManagerRole, int>, IManagerRoleRepository { public ManagerRoleRepository(IOptionsSnapshot<DbOption> options) { _dbOption = options.Get("CzarCms"); _dbConnection = ConnectionFactory.CreateConnection(_dbOption.DbType, _dbOption.ConnectionString); } }

可以看到,仓储的构造函数通过IOptionsSnapshot<DbOption>注入配置,再由 ConnectionFactory.cs 按DbType创建 SqlServer / MySQL / PostgreSQL 三种连接——换数据库只改配置,不改代码

后续新增业务模块时,你只需要:

  1. Czar.Cms.IRepository里写接口IXxxRepository
  2. Czar.Cms.Repository.SqlServer里写XxxRepository实现;
  3. 命名以Repository结尾——完成,无需回到 Startup.cs 改一行代码

这就是"自动扫描整个程序集"的价值:注册逻辑从"每个类一行代码"变成"一个规则扫一遍",漏注册的可能性基本归零。

⚠️ 实战要点与常见坑

  • 🔍 节名必须一字不差appsettings.json中的节名是DbOpion(作者的小拼写失误),代码里GetSection("DbOpion")必须与之完全一致,否则绑定出来是 null,运行时才炸。
  • 🔒 单例要单独注册:如ScheduleCenter这类带状态的服务,用services.AddSingleton<ScheduleCenter>()显式注册(Startup.cs),不要交给约定扫描。
  • 🧵 扫描范围要精准RegisterAssemblyTypes是按"程序集"扫描的,仓储与业务分属两个程序集分别注册,避免把不该注册的类型扫进来。
  • 📦 Populate 不能少:忘记builder.Populate(services)是最常见的坑,症状是"AutoFac 解析不到 IMvcBuilder 系的服务",报错信息往往还很迷惑。

🔚 小结

能力Czar.Cms 的做法
多环境配置appsettings.json + 环境文件自动合并
强类型配置services.Configure<DbOption>("CzarCms", ...)命名选项
依赖注入AutoFac 四步法 + 命名约定自动扫描
多数据库支持ConnectionFactory 按 DbType 分派连接

配置决定"系统怎么连",DI 容器决定"系统怎么活"。读懂了 Czar.Cms 的这套组合拳,你在自己的 ASP.NET Core 项目里也可以轻松搭出"命名即注册"的自动装配体系。

【免费下载链接】Czar.Cms.NET Core实战项目之CMS系列教程的源码,精简而又功能丰富的权限设计,内容管理设计让你轻松搭建一个ASP.NET Core2.2的网站系统.此项目准备用EFCore进行重构,敬请期待项目地址: https://gitcode.com/gh_mirrors/cz/Czar.Cms

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 14:52:05

TOPSIS综合评价法:从原理到Python实战,告别“拍脑袋”决策

1. 从“拍脑袋”到“算数据”&#xff1a;为什么我们需要综合评价方法 在项目评审、人才选拔、产品选型这些日常工作中&#xff0c;我们常常面临一个经典难题&#xff1a;面对多个各有优劣的选项&#xff0c;到底该怎么选&#xff1f;比如&#xff0c;公司要采购一批服务器&…

作者头像 李华
网站建设 2026/8/28 14:51:34

深入解析西门子V90伺服GSD文件:从PROFINET集成到外部DI控制实战

简介&#xff1a;在工业自动化领域&#xff0c;设备通信集成是构建稳定控制系统的基石。其核心原理在于通过标准化的设备描述文件&#xff08;如GSD文件&#xff09;&#xff0c;实现不同厂商设备在工业网络中的互操作与数据交换。这项技术的核心价值在于打破了设备间的信息孤岛…

作者头像 李华
网站建设 2026/8/28 14:50:38

Token成本失控?企业AI成本治理实战:从计费原理到限额监控

“连卖AI的微软也扛不住了”这句话&#xff0c;听起来像一句调侃&#xff0c;但放到技术圈里&#xff0c;它其实是一个再实在不过的成本信号&#xff1a;AI能力再强&#xff0c;Token账单会告诉你现实有多残酷。 先说我的判断&#xff1a;这件事真正值得关注的&#xff0c;不是…

作者头像 李华
网站建设 2026/8/28 14:49:04

PPBadgeView 使用教程

PPBadgeView 使用教程 【免费下载链接】PPBadgeView iOS Custom Badge, Support UIView, UITabBarItem, UIBarButtonItem ,Support Objective-C/Swift; iOS自定义Badge组件, 支持UIView, UITabBarItem, UIBarButtonItem, 支持Objective-C/Swift 项目地址: https://gitcode.co…

作者头像 李华
网站建设 2026/8/28 14:46:06

Oura 智能戒指睡眠追踪功能遭起诉,准确性受质疑!

ZDNET核心要点 一场诉讼盯上了 Oura 智能戒指据称不准确的睡眠追踪功能&#xff0c;原告称其睡眠追踪“准确的概率就像抛硬币一样”&#xff0c;不过 Oura 为其智能戒指的技术和方法进行了辩护。 一个能测量心率、体温和呼吸频率等生物特征信号的智能戒指&#xff0c;能否利用这…

作者头像 李华
网站建设 2026/8/28 14:42:42

【Docker】完美解决拉取镜像超时报错:ERROR: Get https://registry-1.docker.io/v2/

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支持,我们一起进步!😄 🎉如果文章对你有帮助的话,欢迎 点赞 �…

作者头像 李华