我目前正在创建一个小型个人窗口(桌面).NET LOB应用程序,我想借此机会增加我对DI的知识和经验。我已将我的应用程序分为模型、DAO 和 GUI 部分,但我想知道如何实现一些横切概念,例如:
- 当前登录用户 - 用于:
- 声明权限 - 在应用程序的某些部分,我检查用户是否拥有必要的权限
- 审计 - 将用户操作记录到单独的数据库表中
- ETC
- 当前应用程序参数(从配置文件或表中加载) - 用于:
- 定义业务战略
- 定义 UI(例如主题)
- ETC
- 记录到文件/数据库日志 - 用于:
- 记录 UI 动作(点击按钮等)
- 记录业务流程(计算结果、战略决策等)
- 记录基础设施的东西(用于 CRUD 操作的 SQL)
- ETC
目前我可以想到几种方法来提供这些信息:
- 使用静态属性 - UserEntity.Current、Configuration.Current、Logger.Current 等。
- 优点:
- 易于实施
- 使用简单
- 缺点:
- 变得凌乱
- 目前尚不清楚应用程序的哪个部分使用了什么
- 如果您需要更精细的粒度,则不能使用(例如,如果应用程序中的某些进程需要覆盖当前值)
- 优点:
- 使用DI - 为每个需要此信息的类提供属性/ctor 参数
- 优点:
- 每个班级都清楚它需要什么
- 单元测试很容易
- 缺点:
- 它似乎只是让构造函数爆炸
- 如果类需要具有默认构造函数,则会出现问题
- 当类被第 3 方 (XAML) 实例化时难以设置
- 优点:
- 使用服务定位器
- 优点:
- 易于设置
- 便于使用
- 缺点:
- 目前尚不清楚应用程序的哪个部分使用了什么
- 难以设置更精细的粒度(但并非不可能)
- 优点:
我目前倾向于使用 ServiceLocator,因为我以前使用过它,而且效果很好。但是我担心失去控制。很容易找到服务定位器,而不是尝试解决设计问题。
有人可以提供他们的经验/知识吗?