Spring.Net中的服务定位器样式查找 - 更好的想法?

时间:2011-03-30 13:26:00

标签: c# .net dependency-injection ioc-container spring.net

我正在使用以下方法按类型从Spring.Net上下文中获取对象,因为我希望只有一个,所以我不需要在我的代码中放入魔术字符串。我已经看到这个区域出现在配置文件中,因为那里可能很慢。是否有更少的暴力和更好的方式来做这件事?

public static T Locate<T>()
{
    var objList = Context.GetObjectsOfType(typeof(T));
    if (objList.Count == 0)
        throw new Exception("No object of type: " + typeof(T).FullName + " found");
    if (objList.Count > 1)
        throw new Exception("Multiple objects of type: " + typeof(T).FullName + " found");
    T oneObj = default(T);
    foreach (DictionaryEntry e in objList)
        oneObj = (T)e.Value;
    return oneObj;
}

有时我也会使用此样式传递运行时参数。在有人跳过我的反模式之前...据我所知,做一个服务定位器类型模式是传递其值仅在运行时已知的参数的唯一方法。

public static T Locate<T>(params object[] arguments) where T : class
{
    var objectNames = Context.GetObjectNamesForType(typeof(T));
    if (objectNames.Length == 1)
    {
        return Context.GetObject(objectNames[0], arguments) as T;
    }
    if (objectNames.Length == 0)
    {
        throw new ApplicationException("No object of type: " + typeof(T).FullName + " found");
    }
    throw new ApplicationException("Multiple objects of type: " + typeof(T).FullName + " found");
}

1 个答案:

答案 0 :(得分:1)

如果您想使用ServiceLocator模式,建议您使用small project on codeplex called CommonServiceLocator。它带有一个Spring.net适配器实现。

这样,您的代码将不依赖于Spring容器,允许您根据需要使用其他容器。

一般来说,我认为你不想从代码中过多地访问你的IOC容器。让容器进行接线; - )。