2

我目前正在创建一个小型个人窗口(桌面).NET LOB应用程序,我想借此机会增加我对DI的知识和经验。我已将我的应用程序分为模型、DAO 和 GUI 部分,但我想知道如何实现一些横切概念,例如:

  • 当前登录用户 - 用于:
    • 声明权限 - 在应用程序的某些部分,我检查用户是否拥有必要的权限
    • 审计 - 将用户操作记录到单独的数据库表中
    • ETC
  • 当前应用程序参数(从配置文件或表中加载) - 用于:
    • 定义业务战略
    • 定义 UI(例如主题)
    • ETC
  • 记录到文件/数据库日志 - 用于:
    • 记录 UI 动作(点击按钮等)
    • 记录业务流程(计算结果、战略决策等)
    • 记录基础设施的东西(用于 CRUD 操作的 SQL)
    • ETC

目前我可以想到几种方法来提供这些信息:

  • 使用静态属性 - UserEntity.Current、Configuration.Current、Logger.Current 等。
    • 优点:
      • 易于实施
      • 使用简单
    • 缺点:
      • 变得凌乱
      • 目前尚不清楚应用程序的哪个部分使用了什么
      • 如果您需要更精细的粒度,则不能使用(例如,如果应用程序中的某些进程需要覆盖当前值)
  • 使用DI - 为每个需要此信息的类提供属性/ctor 参数
    • 优点:
      • 每个班级都清楚它需要什么
      • 单元测试很容易
    • 缺点:
      • 它似乎只是让构造函数爆炸
      • 如果类需要具有默认构造函数,则会出现问题
      • 当类被第 3 方 (XAML) 实例化时难以设置
  • 使用服务定位器
    • 优点:
      • 易于设置
      • 便于使用
    • 缺点:
      • 目前尚不清楚应用程序的哪个部分使用了什么
      • 难以设置更精细的粒度(但并非不可能)

我目前倾向于使用 ServiceLocator,因为我以前使用过它,而且效果很好。但是我担心失去控制。很容易找到服务定位器,而不是尝试解决设计问题。

有人可以提供他们的经验/知识吗?

4

1 回答 1

2

方法开始的完美案例。您的应用程序的 LOB 将根据已与不同的非功能需求交叉的业务功能需求进行设计:身份验证、审计、日志记录等。

同时,一些当前的应用需求可以通过来解决。首先,我建议首先识别composition root。例如,在应用程序中,它就是Application.OnStartup方法。如果您能够识别组合根,最好避免服务定位器在维护和测试时会增加不必要的复杂性,因为它实际上可以解决任何问题,因此依赖关系管理会很复杂。

下一步,要决定:依赖注入面向方面的方法应该分开还是结合。这两种方法都有优点和缺点。

在选择分离的方法时,您可以使用具有很多好处的:很棒的示例和文档、社区和准备使用的方面。但是没有什么是免费的,postsharp在免费版本中只有有限数量的功能以及与复杂集成。

另一种解决方案:将结合起来。只要您遵循概念:针对接口而不是实现进行编程-您将满足所有要求。好处:在一个地方连接所有组件。有两个主要缺点:第一个动态代理本身非常有限,第二个 -依赖注入容器动态代理之间的集成- 对于某些容器它已经存在,对于其他容器不存在。示例:Ninject 扩展 Interception或 StructureMap 和 Interception。

我建议您查看以下资源以自己找到更多答案: * Book AOP in .NET: Practical Aspect-Oriented Programming by Matthew D. Groves:第一章免费提供 * Book Dependency Injection in .NET by Mark Seemann:写得很好的关于依赖注入的书,第 9 章专门介绍拦截,我发现在你所描述的情况下,这种方法非常有用。这本书的作者还有一个优秀的博客,专门介绍依赖注入和关于使用依赖注入的面向方面编程的视频。

于 2012-12-30T17:17:21.283 回答