【发布时间】:2010-12-18 03:25:33
【问题描述】:
我正在尝试确定是否需要付出额外的努力来封装我的 IoC 容器。经验告诉我,我应该在我的应用程序和任何第三方组件之间放置一层封装。我只是不知道这是否有点矫枉过正。
我可以想到我可能想要切换容器的情况。例如,我当前的容器停止维护,或者其他容器被证明更轻/性能更佳,更适合我的需求。如果发生这种情况,那么我可能需要重新布线。
为了清楚起见,我正在考虑封装类型的注册和解析。我认为封装分辨率是不费吹灰之力的 - 我希望将帮助程序/实用程序类委托给容器是一种常见的做法。
编辑:
假设我更喜欢以编程方式连接我的类型以实现类型安全、编译时检查和可重构性。这是这个代码及其对容器的依赖,我希望保护自己免受攻击。
我还为其他几个共享许多相同关系的项目使用了 IoC 容器,但使用该容器很痛苦,所以我想要改变。但是,更改意味着我失去了注册码的可重用性。因此,为什么我正在考虑封装。这不是一个巨大的负担,但我还是想减轻这个负担。
我正在寻找:
- 尽量减少容器/容器版本变化的影响
- 为可能使用不同容器的项目提供一定程度的类型注册一致性
- 提供对我有意义的接口方法(RegisterSingleton
而不是 RegisterType ( SomeLifetimeProvider ) - 以 Unity 为例)。 - 随着条件/可扩展性要求的变化(例如在解析/注册期间添加更好的缓存、日志记录等。
- 提供我自己的模型来注册类型映射。
- 假设我想在一个程序集/包中创建一堆 RegistrationHandler 对象,这样我就可以轻松地将注册职责分离到多个类中,并自动获取这些处理程序,而无需在其他任何地方更改代码。
我意识到这有点主观,所以利弊可能会有所帮助
谢谢!
【问题讨论】:
-
已经完成了。 (至少对于 .NET。)Common Service Locator library 无论如何,我同意 Knesek 先生的观点。你通常只需要在你的顶级类中依赖你的容器。
-
对于我想要实现的目标来说,这似乎有点矫枉过正。如果我选择更改容器(在我当前的项目或未来的项目中),我只想尽量减少更改的影响。我不想引入另一个第三方库来完成这个。
标签: ioc-container encapsulation