【问题标题】:Selecting an IoC framework (for DI and AOP) [closed]选择 IoC 框架(用于 DI 和 AOP)[关闭]
【发布时间】:2014-08-11 20:00:56
【问题描述】:

我们正在构建一个 .NET 应用程序,我想集成一个框架来执行 DI 和一些 AOP(注入一些诊断/日志记录代码)。

我知道那里有很多框架,我不确定要选择哪一个,因为每个审查它们的网站都会给出不同的结果和意见。

我很想听听一些客观的信息,这些信息是基于现实世界的经验来做我们需要做的事情(上面列出的)。

【问题讨论】:

标签: c# .net dependency-injection inversion-of-control aop


【解决方案1】:

简答:看看 PRISM、UNITY 和 MEF,以完全了解 Microsoft 模式和(最佳)实践。没有理由从那个 imo 转移,除非你做非常小的项目(Prism 可能过大)。

【讨论】:

【解决方案2】:

答案最重要的是应用程序的设计。如果您围绕SOLID 原则设计您的应用程序,那么添加横切关注点将与编写装饰器一样简单。换句话说,当你需要像 Postsharp 这样的代码编织框架或者需要做拦截时,你可能需要再次仔细审视你的设计。例如,看看如何使用commands and handlers 对业务运营进行建模,或者如何将查询建模为DTOs and handlers

所有容器都允许您使用装饰器包装服务,因为您可以注册一个执行以下操作的 lambda:

container.Register<ICommandHandler<ProcessOrderCmd>>(() =>
    new DiagnosticsCommandHandlerDecorator<ProcessOrderCmd>(
        new ProcessOrderCommandHandler()));

但是,当整个应用程序围绕 SOLID 进行设计并且应用程序变大时,像这样手动配置每个服务将变得繁琐且耗时。所以在这种情况下,选择一个包含批量注册功能并支持注册装饰器的 DI 框架非常有用。特别是对处理通用装饰器的支持(如上所示的DiagnosticsCommandHandler&lt;T&gt;)将变得很重要。

例如,当您使用Simple Injector IoC container 时,您只需两行代码即可使用装饰器注册所有命令处理程序:

// This registers all command handlers in the container.
container.RegisterManyForOpenGeneric(typeof(ICommandHandler<>),
    typeof(ICommandHandler<>).Assembly);

// This wraps all command handlers with the given decorator.
container.RegisterDecorator(typeof(ICommandHandler<>),
    typeof(DiagnosticsCommandHandlerDecorator<>));

虽然某些模式或框架对于小型应用程序来说可能过于矫枉过正,但我​​相信 SOLID 原则是面向对象设计的核心原则,每个应用程序的设计都应牢记这些原则。

【讨论】:

  • 我对装饰器的需求主要用于诊断目的(即:记录所有方法参数以进行测试)。我计划在测试期间将这段代码注入到我们应用程序核心层中的大多数方法中(例如,我相信 PostSharp 允许在程序集级别注入它)。
  • 我的经验是那些装饰器可以用来插入很多特性。很难预测你将来需要什么样的装饰器,但好在这并不重要,因为设计非常灵活/可插拔,允许你添加你需要的东西,而不需要复杂的设计。 YAGNI 代码。
  • 并且不要忘记,除非您使用the commercial version of PostSharp,否则添加横切关注点的唯一方法是将属性应用于您的代码。这仍然会导致维护问题,因为您仍然需要在任何地方应用该属性并在需要添加/更改/删除横切关注点时更改所有这些行。这违反了开放/封闭原则。好的设计是第一位的;第二个工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
相关资源
最近更新 更多