Создание сервисного слоя и репозиториев один раз в течение жизни веб-приложения - PullRequest
1 голос
/ 09 июля 2011

В течение жизни моего веб-приложения я знаю, что все мои сервисы и репозитории будут вызываться. Я хотел бы создать их один раз во время запуска веб-приложения и обратиться к конкретным ссылкам в моем коде.

Существует ли общая схема создания экземпляров ваших служб / репозиториев только один раз за время существования веб-приложения, не делая их статичными или одиночными.

Я бы не хотел делать свои сервисы / репозитории статическими классами или синглетами для тестируемости, однако создание экземпляров их при каждом веб-запросе кажется неправильным, когда они предназначены для сохранения состояния, и я знаю, что все они будут необходимы в течение жизни приложение.

Я использую c # / asp.net.

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Понятие, которое вам нужно, называется IoC / DI, и для этого есть много платформ.Когда у вас есть такой класс, как CustomerService, и вам нужен CustomerRepository, по определению это зависимость, и вы должны передать его через конструктор CustomerService - но тогда возникает вопрос, где вы будете создавать экземпляр CustomerService?Ну, кто использует этот сервис, должен получить его и через конструктор, это может быть CustomerPresenter или какой-то другой класс, не относящийся к делу.Моя точка зрения заключается в том, что при внедрении зависимостей вы структурируете свой код в одну точку, где инфраструктура IoC / DI разрешает эти зависимости в соответствии с вашими правилами.

В самом начале программы у вас будет что-то вроде:

ICustomerPresenter presenter = IoC.Resolve<ICustomerPresenter>();

и все автоматически объединится за кулисы.

Чтобы достичь этого, вот пример со StructureMap:

For<ICustomerPresenter>().Use<CustomerPresenter>();
For<ICustomerService>().Singleton().Use<CustomerService();
For<ICustomerRepository>().Singleton().Use<CustomerRepository>();

С этим высохранить тестируемостьЗдесь я многое упростил, так что это не очень удобно для использования, как есть, но есть много ресурсов IoC / DI онлайн, так что ознакомьтесь с ними.

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

0 голосов
/ 09 июля 2011

Каркасы Dependency Injection позаботятся о времени жизни ваших объектов.

Например

container.RegisterType<MyService>().Singleton();

Существует множество DI-фреймворков, которые выбирают то, что вам больше подходит.

...