【发布时间】:2012-01-26 12:29:31
【问题描述】:
我正在开发一个大型遗留 C# 应用程序,分配给我的任务是删除静态工厂类 ServiceLocator.GetObject<T>() 的所有用法,并在整个过程中替换为构造函数注入的依赖项。
在大多数情况下,这很简单,但是在应用程序代码库中大约有 50 种情况有点棘手。例如,Servicelocator 用于静态类、扩展方法,甚至 WPF MarkupExtension!。
例如,如果您遇到这样的代码 sn-p,您会怎么做? (除了哭声)
public static class MyExtensions
{
private static ISingletonServiceOne _ServiceOne = null;
private static ISingletonServiceTwo _ServiceTwo = null; // etc ...
public static SummaryHeader GetBannerSummary(this IModel rfq, object requester)
{
Guard.ArgumentNotNull(rfq, "rfq");
Guard.ArgumentNotNull(requester, "requester");
if (_ServiceOne == null)
{
_ServiceOne = ServiceLocator.GetService<ISingletonServiceOne>(requester);
Guard.ArgumentNotNull(_ServiceOne, "_ServiceOne");
}
return _ServiceOne.GetBannerSummary(rfq);
}
在上面,ServiceLocator.GetObject() 方法已在 IModel 上的扩展方法中使用,以定位单例注册服务并使用 IModel 在该服务上执行方法。
问题是:
- 是否有任何模式/实践可以避免此类事情 - 静态类、值转换器或扩展方法中需要的 DI 容器
- 是否有任何模式/实践来处理 DI 中的循环依赖关系?
- 如果在良好的代码和交付时间之间进行权衡,您会怎么做?
我正在考虑将 GetBannerSummary() 方法从扩展中移出,在这种情况下只有 IModel,但是(不要笑)在 ValueConverters (WPF) 和 MarkupExtensions 中使用相同的 ServiceLocator 的情况:0
感谢您的 cmets/建议
【问题讨论】:
标签: c# design-patterns dependency-injection extension-methods factory-pattern