DI и Singleton Pattern в одной реализации - PullRequest
6 голосов
/ 16 декабря 2009

Я хочу провести рефакторинг некоторого кода с использованием инфраструктуры IOC / DI Windsor, но моя проблема в том, что у меня есть некоторые классы Singleton и шаблоны классов Factory, и я не уверен, что можно реализовать Singleton или Factory с использованием DI.

У кого-нибудь есть идеи, если это возможно и как?

Ответы [ 3 ]

6 голосов
/ 16 декабря 2009

Шаблон проектирования Singleton расходится с DI. В то время как возможно открыть Синглтон настолько, что DI и Открытый / Закрытый Принцип начинают иметь смысл, это изменит Синглтон настолько, что он почти перестает быть Синглтоном.

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

Гораздо лучше просто определить свои сервисы и классы, не рассматривая их слишком много. Если у вас есть объект, которым вы хотели бы поделиться между несколькими потребителями, большинство DI-контейнеров имеют концепцию Singleton срок службы , которая имитирует преимущества шаблона проектирования Singleton без каких-либо недостатков

Вкратце: синглтоны - это зло, и их следует избегать.

Абстрактная фабрика , с другой стороны, очень полезен для целей DI.

2 голосов
/ 16 декабря 2009

Вы не позволяете контейнеру МОК делать это. Если раньше у вас были явные вызовы фабрики для получения одноэлементного экземпляра объекта, то теперь у вас есть контейнер IOC, который создает для вас граф объектов, и он подключает все, где ему принадлежит. Контейнер гарантирует, что ваши синглтоны являются синглетонами, и он действует как фабрика.

Если вы говорите о том, чтобы фабрика решала во время выполнения, какой тип объекта обслуживать, DI там не применяется, за исключением того, что вы можете заставить контейнер DI вводить фабрику там, где вы хотите, и управлять ее областью действия за вас.

0 голосов
/ 16 декабря 2009

Большинство современных платформ внедрения зависимостей позволяют вам указать, должны ли они обслуживать один экземпляр объекта в течение жизни приложения (или запроса) или создавать новые экземпляры каждый раз, когда вы запрашиваете один.

Вы также можете использовать инфраструктуру DI для разрешения зависимостей от фабрик, когда это уместно (если вы это имеете в виду). Вы можете сделать это, если фабрика выбирает подкласс на основе данных времени выполнения, или если зависимому объекту необходимо создать много экземпляров IFoo, и в этом случае вы можете внедрить IFooFactory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...