C# 选择IoC框架(用于DI和AOP)

C# 选择IoC框架(用于DI和AOP),c#,.net,dependency-injection,inversion-of-control,aop,C#,.net,Dependency Injection,Inversion Of Control,Aop,我们正在构建一个.NET应用程序,我想集成一个用于执行DI和一些AOP(注入一些诊断/日志代码)的框架 我知道有很多框架,我不确定该选择哪一个,因为每个审查它们的网站都会给出不同的结果和意见 我很想听到一些基于现实世界经验的客观信息来做我们需要的事情(如上所列)。简短回答:看看PRISM、UNITY和MEF,以充分了解Microsoft模式和(最佳)实践领域。没有理由从imo转移注意力,除非你做的是非常小的项目(Prism可能会过大)。答案在应用程序的设计中是最重要的。如果您围绕这些原则设计应用

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

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


我很想听到一些基于现实世界经验的客观信息来做我们需要的事情(如上所列)。

简短回答:看看PRISM、UNITY和MEF,以充分了解Microsoft模式和(最佳)实践领域。没有理由从imo转移注意力,除非你做的是非常小的项目(Prism可能会过大)。

答案在应用程序的设计中是最重要的。如果您围绕这些原则设计应用程序,那么添加横切关注点将非常简单,就像编写装饰程序一样。换句话说,当您需要像Postsharp一样的代码编织框架或需要进行拦截时,您可能需要再次仔细查看您的设计。例如,看看如何使用建模业务操作,或者如何将查询建模为

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

container.Register(()=>
新诊断命令HandlerDecorator(
新的ProcessOrderCommandHandler());
然而,当整个应用程序围绕SOLID进行设计并且应用程序变大时,像这样手动配置每个服务将变得繁琐和耗时。因此,在这种情况下,选择一个包含批注册特性并支持注册装饰器的DI框架是非常有用的。特别是对处理泛型装饰器的支持(如上面所示的
DiagnosticsCommandHandler
)将变得非常重要

例如,当您使用时,只需两行代码就可以向decorator注册所有命令处理程序:

//这将注册容器中的所有命令处理程序。
container.RegisterManyForOpenGeneric(typeof(ICommandHandler)),
类型(ICommandHandler).Assembly);
//这将使用给定的decorator包装所有命令处理程序。
容器.注册表记录器(类型为(ICommandHandler),
类型(DiagnosticsCommandHandlerDecorator);

尽管一些模式或框架对于小型应用程序来说可能过于苛刻,但我相信坚实的原则是面向对象设计的核心原则,每个应用程序的设计都应该牢记这些原则。

阅读我的依赖注入/IoC文章(这篇文章也展示了我的容器):我对decorator的需求主要用于诊断目的(即:记录所有方法参数以进行测试)。我计划在测试期间将此代码注入应用程序核心层的大多数方法(如果不是全部的话)(例如,我相信PostSharp允许在程序集级别注入此代码)。我的经验是,这些装饰器可以用于插入许多功能。很难预测你将来需要什么样的装饰器,但好在这并不重要,因为设计非常灵活/可插拔,允许你添加你需要的东西,而不需要复杂的设计和大量的YAGNI代码。别忘了,除非你使用,添加横切关注点的唯一方法是将属性应用到代码中。这仍然会导致维护问题,因为在需要添加/更改/删除横切关注点时,仍然需要在所有位置应用该属性并更改所有这些行。这违反了打开/关闭原则。好的设计是第一位的;第二个工具。统一+1。它易学、轻量级,并且内置AOP支持。不幸的是,MEF的情况更糟。