我一直在考虑是否可以应用DI模式而不会产生虚拟方法调用的代价(根据实验,我的确可以比非虚拟调用慢4倍)。我的第一个想法是通过仿制药做的依赖注入:.Net中的依赖注入没有虚拟方法调用?
sealed class ComponentA<TComponentB, TComponentC> : IComponentA
where TComponentB : IComponentB
where TComponentC : IComponentC
{ ... }
不幸的是,CLR仍然没有方法通过即使TComponentB和TComponentC的具体实现指定为泛型类型参数,所有的类都是接口调用宣布为密封。获得CLR执行非虚拟调用的唯一方法是将所有类更改为结构(实现接口)。使用结构对于DI来说并不合适,并且使得下面的问题更加无法解决。
上述解决方案的第二个问题是它无法处理循环引用。我无法想出任何方法,无论是通过C#代码还是通过构建表达式树来处理循环引用,因为这会导致无限递归泛型类型。 (.Net不支持引用自身的泛型类型,但似乎并没有推广到这种情况。)由于只有结构可以导致CLR绕过接口,所以我认为这个问题根本不可解,因为循环引用结构可能会导致矛盾。
我只能想到其他解决方案,它可以保证工作 - 在运行时从头开始放置所有类,也许将它们作为模板以编译类为基础。虽然不是一个理想的解决方案。
任何人有更好的点子?
编辑:关于大多数评论,我想我应该说这是在“纯粹的知识分子好奇心”下提出的,我辩论是否问这个问题是因为我意识到我没有任何具体的案例,这是必要的。我只是为了好玩而思考它,并想知道是否有其他人遇到过。
慢4倍?我觉得很难相信。我想这个文件“过早优化”下... – BFree 2010-01-26 18:53:16
这是一个个人的,无期限的项目,所以我得到了过早的优化沉迷:) – jthg 2010-01-26 18:56:21
@jthg - 过早的优化可以伤害的不仅仅是最后期限了。 – 2010-01-26 18:58:20