我正在构建一个MVC 3站点,并希望使用Spring来提供我的Web服务适配器的运行时注入,这样我就可以在模拟服务调用中存根,而不是调用真正的交易。
var ctx = ContextRegistry.GetContext();
var serviceAdapter = (IServiceAdapter) ctx[Constants.C_ServiceAdapter];
...
serviceAdapter.doSomething();
我之前在Spring线程安全上受到了攻击,其中singleton不是“false”,所以看看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>
我的问题:为什么使用这个不明智的?是不是因为我们不需要两条锅炉板? AFAIK我还在声明最终会在配置中创建什么对象,所以不要看它是如何使它更紧密耦合的?
注意:我真的不想沿着使用Spring.Web dll的路线走下去,通过配置完成我的所有DI,如果我能帮忙的话!
非常感谢 邓肯
答案 0 :(得分:2)
这是一个坏主意,因为您没有使用依赖注入。这不是因为GetContext方法的任何线程安全考虑因素。您使用的服务定位器模式被认为是不好的做法 - 类不应该负责查询DI容器以获取依赖关系,应该注入这些依赖关系。
作为最佳实践,您应该考虑编写基于Spring.NET的自定义dependency resolver。这种依赖关系将自动注入控制器和其他类。