温莎城堡有什么缺点?

我一直在寻找城堡项目,特别是温莎。 我对这种技术的可能性印象深刻,拥有松散耦合系统的好处显而易见。 唯一我不确定的是,如果使用这种方法有任何缺点,特别是在asp.net? 例如性能命中等。

我正试图让这个方法的好处对我的开发人员可见,并且正在受到以下的回击:

  1. 这是使用reflection,每次从容器调用一个对象,reflection必须使用,所以性能将是可怕的。 (这是这种情况吗?每次通话都使用reflection?)

  2. 如果我依靠接口; 我如何处理那些已经join了课堂的额外方法和属性的对象呢? (通过inheritance)

回答你的问题:

  1. 这是使用reflection,每次从容器中调用一个底物,reflection必须使用,所以性能将是可怕的。 (这是这种情况吗?每次通话都使用reflection?)
  • 不,不是的。 大多数情况下,当您注册组件时,它会使用很less的reflection。 它也可能在生成代理types时使用reflection,第一次从容器中请求一个组件。
  1. 如果我依靠接口; 我如何处理那些已经join了课堂的额外方法和属性的对象呢? (通过inheritance)
  • 这全是devise的问题。 你不想拥有容器创build的每个对象。 您主要用于服务依赖关系。 在这种情况下,你不关心实际上隐藏在界面后面的是什么types(这就是它的全部重点,不是吗?)。

您也可以拥有类组件,但是它们有局限性,并且您必须知道这些组件(例如,您不能拦截对非虚拟方法的调用)。 我发现温莎是最成熟的,最适合我所有的发展风格。

除此之外,性能,我还没有听说过一个项目,因为不可接受的性能不得不放弃依赖容器。 温莎真的很聪明,它caching了冗长的操作的结果,所以你不必两次付出代价。 您可以在Internet上find图表,比较许多IoC容器的速度。 有两件事需要注意:所有容器都非常快。 不要以为这些图表上的其他容器比温莎更快,这意味着它们更好。 温莎为你做了很多东西,其他容器没有。

我已经在高负载下使用IoC容器(Spring.NET和StructureMap)在几个生产应用程序(不是Facebook / MySpace高,但足以压力几个服务器)。

根据我的经验,甚至在我开始使用IoC之前,最大的性能问题是数据库和与数据库的交互 – 优化查询,索引,使用二级caching等。

如果你有一个数据库涉及到你的应用程序,那么温莎或任何其他容器可能造成的任何性能都会比数据库往返次数无限小。

这就好比那些比较新的()运算符与Activator.CreateInstance()的性能命中的人在1-10ms之间,当单个DB往返通常是更昂贵的数量级时。

我build议你不要担心小事情,专注于大事情。

另外,我想build议你看看StructureMap,因为我相信它比Windsor有更多的function,并且没有很多Windsor的缺点(例如,保留引用并要求你释放它们等) 。

我遇到的Castle Windsor遇到的一个问题是无法在Medium Trust中运行(没有我无法重新编译的问题)。 所以我需要从温莎转到统一。

根据DI / IoC的performance – 我相信性能的提升并不是很大,特别是当你记住它的力量的时候。

顺便说一句:如果你是从DI / IoC开始,你应该阅读这篇MSDN文章 。

显着的启动成本,在操作过程中几乎没有性能影响(当然,没有任何对调用的反映 – 在实例化过程中编译所有内容)。 温莎是有点沉重的一面,但适当的终身pipe理不应该导致任何问题。

一个更重要的缺点是,整合问题不会在构build过程中被捕获,有的甚至不会在启动。 如果不仔细追踪所有模块的版本和整个系统的连续testing,就很容易陷入困境。 reflection在这里有帮助,所以Windsor在这方面比其他许多DI框架更好。

根据我的经验,一个IoC容器的性能不可接受的例外是当试图将IoC容器作为IServiceProvider集成/包装以用于ComponentModel时 – 一个常见的例子就是创build自己的托pipewinformsdevise器(通常是build立某种定制devise师,即工作stream程/stream程图等)

由于许多winforms组件的行为方式,特别是在devise时,parsing组件的成本在物理上会导致鼠标在拖动时“口吃”,因为框架每秒可以创build超过30,000次服务分辨率调用 – 这是更多尽pipe我认为对组件本身的糟糕编码实践的反思,或者至less是由于对服务提供者实现的快速/简单的假设。

在实践中,我从来没有发现组件的parsing时间在重负载的商业应用程序中是一个问题。

  1. 这是使用reflection,每次从容器调用一个对象,reflection必须使用,所以性能将是可怕的。 (这是这种情况吗?每次通话都使用reflection?)

据了解,所有的好容器(包括这里的温莎堡)都使用reflection来创build新的实例。 但是这是提高性能。 这是比较慢的Activator.CreateInstance比较。 其他一些集装箱也相当快,可以与新的运营商竞争。 在这里看比较基准线。 温莎城堡不是来自高性能的城堡,但速度并不重要。 在应用程序中使用IoC。 90%的课程应该被设置为单独课程,这意味着只能在应用程序启动时使用。

  1. 如果我依靠接口; 我如何处理那些已经join了课堂的额外方法和属性的对象呢? (通过inheritance)

试试这个教程和本教程。 它会揭示你的问题的答案。 如果你想避免devise的问题和易于维护的软件,我强烈build议去SOLID实践