Я использую следующий метод для получения объектов из контекста 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");
}
0
ss2k 30 Мар 2011 в 17:26
1
Этот вопрос может вас заинтересовать: stackoverflow.com/questions/5026711/…
 – 
Marijn
30 Мар 2011 в 17:42

1 ответ

Если вы хотите использовать шаблон ServiceLocator, я предлагаю вам использовать небольшой проект на codeplex под названием CommonServiceLocator. . Он поставляется с реализацией адаптера Spring.net.

Таким образом, ваш код не будет зависеть от контейнера Spring, что позволит вам использовать другой контейнер, если хотите.

В общем, я не думаю, что вы хотите получить слишком много доступа к контейнеру IOC из кода. Пусть контейнер делает проводку ;-).

1
Marijn 31 Мар 2011 в 12:50
Я просмотрел источник реализации Spring.Net для CSL, и они делают почти то же самое для части определения местоположения. Мне все еще любопытны параметры времени выполнения.
 – 
ss2k
1 Апр 2011 в 22:05