我一直在研究城堡项目,特别是温莎.我对这项技术的可能性印象深刻,拥有这种松散耦合系统的好处显而易见.我唯一不确定的是,如果使用这种方法有任何缺点,特别是在asp.net?例如性能命中等
我试图让这个方法的好处在这里对我的开发人员可见,并且受到以下回击的打击:
这是使用反射,每次从容器调用一个对象时,必须使用反射,因此性能会很糟糕.(这是这种情况吗?它是否在每次通话时使用反射?)
如果我依赖于接口; 如何处理具有已添加到类中的额外方法和属性的对象?(通过继承)
Krzysztof Ko.. 34
回答你的问题:
这是使用反射,每次从容器调用一个对象时,必须使用反射,因此性能会很糟糕.(这是这种情况吗?它是否在每次通话时使用反射?)
不,不是的.大多数情况下,当您注册组件时,它会使用很少的反射.在第一次从容器中请求组件时,它也可以在生成代理类型时使用反射.
如果我依赖于接口; 如何处理具有已添加到类中的额外方法和属性的对象?(通过继承)
这都是设计问题.您不希望容器创建每个对象.您主要将其用于服务依赖性.在这种情况下,你不关心实际隐藏在界面后面的类型(这就是它的全部意义,不是吗?).
您也可以拥有类组件,但它们有限制,您必须了解这些组件(例如,您无法拦截对非虚方法的调用).我发现温莎是最成熟的,最适合我所有的开发容器.
除此之外,Performance,我还没有听说过一个由于不可接受的性能而不得不丢弃依赖容器的项目.温莎非常聪明,它可以缓解冗长操作的结果,因此您无需支付两倍的价格.您可以在Internet上找到图表,比较许多IoC容器的速度.有两点需要注意:所有容器都非常快.不要认为其他容器在这些图表上比Windsor更快的事实意味着它们更好.温莎为你做了很多其他容器没有的东西.
回答你的问题:
这是使用反射,每次从容器调用一个对象时,必须使用反射,因此性能会很糟糕.(这是这种情况吗?它是否在每次通话时使用反射?)
不,不是的.大多数情况下,当您注册组件时,它会使用很少的反射.在第一次从容器中请求组件时,它也可以在生成代理类型时使用反射.
如果我依赖于接口; 如何处理具有已添加到类中的额外方法和属性的对象?(通过继承)
这都是设计问题.您不希望容器创建每个对象.您主要将其用于服务依赖性.在这种情况下,你不关心实际隐藏在界面后面的类型(这就是它的全部意义,不是吗?).
您也可以拥有类组件,但它们有限制,您必须了解这些组件(例如,您无法拦截对非虚方法的调用).我发现温莎是最成熟的,最适合我所有的开发容器.
除此之外,Performance,我还没有听说过一个由于不可接受的性能而不得不丢弃依赖容器的项目.温莎非常聪明,它可以缓解冗长操作的结果,因此您无需支付两倍的价格.您可以在Internet上找到图表,比较许多IoC容器的速度.有两点需要注意:所有容器都非常快.不要认为其他容器在这些图表上比Windsor更快的事实意味着它们更好.温莎为你做了很多其他容器没有的东西.
我在高负载下的几个生产应用程序中使用了IoC容器(Spring.NET和StructureMap)(不是Facebook/MySpace高,但足以强调一些服务器).
根据我的经验,甚至在我开始使用IoC之前,最大的关注点是数据库和与数据库的交互 - 优化查询,索引,使用二级缓存等.
如果您的应用程序涉及数据库,那么与数据库往返相比,Windsor或任何其他容器可能导致的任何性能都会非常小.
这就像人们在1-10ms时比较new()运算符与Activator.CreateInstance()的性能命中率,而单个DB往返通常要贵一个数量级.
我建议你不要担心这些小东西,并专注于大事.
另外,我建议你看一下StructureMap,因为我相信它比Windsor有更多的功能,并且没有很多Windsor的缺点(即坚持引用并要求你发布它们等) .
我遇到的Castle Windsor的一个问题是它无法在Medium Trust中运行(没有重新编译,我无法做到).所以我需要从Windsor切换到Unity.
根据DI/IoC性能 - 我认为性能影响并不大,特别是当你记住它的功率时.
顺便说一句:如果你开始使用DI/IoC,你应该阅读这篇MSDN文章.
显着的启动成本,在操作期间几乎没有性能损失(当然没有反映调用 - 在实例化期间编译的所有内容).温莎有点偏重,但适当的终身管理不应该造成任何问题.
更重要的缺点是在构建过程中没有捕获到集成问题,有些甚至在发布时都没有.如果不仔细跟踪所有模块的版本并对整个系统进行连续测试,很容易遇到麻烦.反射在这里有所帮助,因此Windsor在这方面比其他许多DI框架更好.