Я использую следующий метод для получения объектов из контекста 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 ответ
Если вы хотите использовать шаблон ServiceLocator
, я предлагаю вам использовать небольшой проект на codeplex под названием CommonServiceLocator. . Он поставляется с реализацией адаптера Spring.net.
Таким образом, ваш код не будет зависеть от контейнера Spring, что позволит вам использовать другой контейнер, если хотите.
В общем, я не думаю, что вы хотите получить слишком много доступа к контейнеру IOC из кода. Пусть контейнер делает проводку ;-).
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.