Я знаю, что это старый вопрос, но я хотел бы добавить свои пять центов,
Я думаю, что внедрение зависимостей (DI) во многом похоже на настраиваемый Factory Pattern (FP), и в этом смысле все, что вы могли бы сделать с DI, вы сможете сделать с помощью такой фабрики.
На самом деле, если вы используете, например, spring, у вас есть возможность автоматически подключать ресурсы (DI) или делать что-то вроде этого:
MyBean mb = ctx.getBean("myBean");
А затем используйте этот экземпляр «mb», чтобы делать что угодно. Разве это не вызов фабрики, которая вернет вам экземпляр ??
Единственная реальная разница, которую я замечаю между большинством примеров FP, заключается в том, что вы можете настроить, что "myBean" находится в xml или в другом классе, и фреймворк будет работать как фабрика, но в остальном это то же самое, и вы наверняка может иметь Factory, которая читает файл конфигурации или получает реализацию по мере необходимости.
И если вы спросите мое мнение (а я знаю, что вы этого не сделали), я считаю, что DI делает то же самое, но просто добавляет больше сложности к разработке, почему?
ну, во-первых, чтобы вы знали, какая реализация используется для любого bean-компонента, который вы автоматически подключаете с помощью DI, вам нужно перейти к самой конфигурации.
но ... как насчет того обещания, что вам не нужно будет знать реализацию объекта, который вы используете? пфф! шутки в сторону? когда вы используете такой подход ... разве вы не то же самое, что пишете реализацию ?? и даже если вы этого не сделаете, разве вы почти все время не смотрите, как реализация делает то, что она должна делать ??
и, наконец, не имеет значения, сколько обещает вам инфраструктура DI, что вы будете создавать объекты, отделенные от нее, без каких-либо зависимостей от их классов, если вы используете фреймворк, вы строите все вокруг него, если вам придется изменить подход или фреймворк, это будет нелегкой задачей ... НИКОГДА! ... но, поскольку вы строите все вокруг этого вместо того, чтобы беспокоиться о том, какое решение лучше всего подходит для вашего бизнеса, при этом вы столкнетесь с большой проблемой.
Фактически, единственное реальное бизнес-приложение для подхода FP или DI, которое я вижу, - это если вам нужно изменить реализации, используемые во время выполнения, но, по крайней мере, известные мне фреймворки не позволяют вам сделайте это, вы должны оставить все идеально в конфигурации во время разработки, а если вам это нужно, используйте другой подход.
Итак, если у меня есть класс, который по-разному работает в двух областях в одном приложении (скажем, в двух компаниях холдинга), мне нужно настроить структуру для создания двух разных компонентов и адаптировать свой код для использования каждого из них. Разве это не то же самое, если бы я просто написал что-то вроде этого:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
так же, как это:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
И это:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
В любом случае вам придется что-то изменить в своем приложении, будь то классы или файлы конфигурации, но вам придется сделать это повторно.
Было бы неплохо сделать что-то вроде этого:
MyBean mb = (MyBean)MyFactory.get("mb");
И таким образом вы устанавливаете код фабрики, чтобы получить правильную реализацию во время выполнения в зависимости от предприятия пользователя, вошедшего в систему ?? Вот ЭТО было бы полезно. Вы можете просто добавить новую банку с новыми классами и установить правила, возможно, даже во время выполнения (или добавить новый файл конфигурации, если вы оставите эту опцию открытой), без изменений существующих классов. Это будет динамическая фабрика!
Разве это не было бы более полезным, чем необходимость писать две конфигурации для каждого предприятия и, возможно, даже иметь два разных приложения для каждого ??
Вы можете сказать мне, что мне не нужно переключаться во время выполнения, поэтому я настраиваю приложение, и если я наследую класс или использую другую реализацию, я просто изменяю конфигурацию и повторно развертываю. Хорошо, это также можно сделать с помощью фабрики. И честно говоря, сколько раз вы это делаете? возможно, только тогда, когда у вас есть приложение, которое будет использоваться где-то еще в вашей компании, и вы собираетесь передать код другой команде, и они будут делать такие вещи. Но, эй, это тоже можно сделать с фабрикой, а было бы еще лучше с динамической фабрикой !!
Во всяком случае, раздел комментариев открыт для вас, чтобы убить меня.
person
Community
schedule
13.09.2012