0

我正在构建一个 MVC 3 站点,并希望使用 Spring 提供我的 Web 服务适配器的运行时注入,以便我可以在模拟服务调用中存根,而不是调用真正的交易。

var ctx = ContextRegistry.GetContext();
var serviceAdapter = (IServiceAdapter) ctx[Constants.C_ServiceAdapter];
...
serviceAdapter.doSomething();

我之前一直在 Spring 线程安全上被刺痛,其中单例不是“假的”,所以查看了 Spring 源代码以仔细检查上述是否是线程安全的。

消息来源在评论中有这个:

/// A singleton implementation to access one or more application contexts.  Application
/// context instances are cached.
/// </p>
/// <p>Note that the use of this class or similar is unnecessary except (sometimes) for
/// a small amount of glue code.  Excessive usage will lead to code that is more tightly
/// coupled, and harder to modify or test.  Consider refactoring your code to use standard
/// Dependency Injection techniques or implement the interface IApplicationContextAware to
/// obtain a reference to an application context.</p>

我的问题:为什么使用这个不明智?仅仅是因为我们不需要的2行样板吗?AFAIK 我仍在声明最终将在配置中创建什么对象,所以看不到它如何使它更紧密地耦合?

注意:我真的不想走使用 Spring.Web dll 并通过配置完成所有 DI 的路线,如果我能提供帮助的话!

非常感谢邓肯

4

1 回答 1

2

这是一个坏主意,因为您没有使用依赖注入。这不是因为 GetContext 方法的任何线程安全考虑。您正在使用被认为是不好的做法的服务定位器模式 - 类不应该负责查询 DI 容器以获取依赖项,这些依赖项应该被注入。

作为最佳实践,您应该考虑编写基于 Spring.NET的自定义依赖解析器。这样,依赖项将自动注入控制器和其他类。

于 2012-09-17T15:33:34.253 回答