ASP.Net StructureMap Внедрение ранее объектов в качестве зависимостей - PullRequest
0 голосов
/ 07 декабря 2011

(TLDR? Пропустите последние параграфы для вопросов ...)

У меня есть классический сайт ASP.Net, который изначально был построен на уровне доступа к данным, состоящему из статических методов, охватывающих ADO.Сеть.Совсем недавно мы представили слои абстракции, разделенные интерфейсами, которые склеены в StructureMap.Однако даже в этом новом многоуровневом подходе уровень хранилища по-прежнему охватывает старые статические классы ADO.Net (мы не были готовы взять на себя задачу реализации ORM, одновременно реорганизуя архитектуру нашего приложения).

Это работало нормально - до сегодняшнего дня.Изучая некоторые неожиданные проблемы с производительностью, которые у нас были в последнее время, мы заметили несколько вещей о наших классах доступа к данным:

  1. Наши экземпляры SqlDataConnection не всегда закрываются.
  2. объекты соединения хранятся в статических переменных.

Оба из вышеперечисленных являются плохой практикой и, вероятно, значительно способствуют нашим проблемам с производительностью.Причина, по которой соединения устанавливались в статических переменных, заключалась в том, что они разделялись между методами доступа к данным, что является хорошей идеей в теории - это просто ужасная реализация.

Наше решение заключается в преобразовании статических классов доступа к данным /методы в объекты - наш базовый класс DataManager создается один раз в начале запроса и размещается один раз в конце (через новый класс PageBase в веб-слое - большая часть нашего кода еще не разделена на слои).Это означает, что у нас есть один экземпляр класса доступа к данным, который используется для всего жизненного цикла запроса, и, следовательно, только одно соединение.

Проблема начинается сейчас, когда мы добираемся до областей сайта, используя более новыемногоуровневая архитектура.В более старом коде мы могли бы просто передать ссылку на экземпляр DataManager непосредственно на уровень доступа к данным из-за кода, но это не работает, когда слои разделены интерфейсами, и только StructureMap знает о различных частях.

Итак, со всем фоном вот вопросы:

  • Возможно ли для StructureMap создавать экземпляры, передавая ранее созданные объекты в качестве зависимостей - в контексте одногоASP.Net Page жизненный цикл?
  • Если это возможно, как это достигается?Я не видел ничего очевидного в моих поисках и не должен был делать это в прошлом.
  • Если это невозможно, что может быть альтернативным решением проблемы, которую я описал выше?

ПРИМЕЧАНИЕ. Это может иметь или не иметь значение: мы вызываем ObjectFactory.BuildUp (this) на специальной базовой странице для тех страниц, которые были преобразованы для использования новой архитектуры - ASP.Net нене обеспечивает хорошую точку доступа.

1 Ответ

0 голосов
/ 10 декабря 2011

Хорошо, в конце концов, это было не так сложно. Вот код:

var instantiatedObject = new PropertyType();

ObjectFactory.Configure( x => 
    {
        x.For<IPropertyType>().Use( () => instantiatedObject );
        x.SetAllProperties( p => p.OfType<IPropertyType>() );
    }
);

Мы просто помещаем это в наш класс PageBase перед строкой ObjectFactory.BuildUp( this ). Чувствуется себя немного грязно, если поместить конфигурацию IoC в основной код, как этот, - но это классический ASP.Net и альтернатив не так много. Я думаю, мы могли бы предоставить некоторую абстракцию.

...