1

Я вхожу в инверсию управления, в частности, используя Guice и RoboGuice для Android, и у меня есть вопрос.Обращение управления Создание нового объекта

У меня есть вызов метода, который возвращает ресурс (который по существу является строкой XML или JSON).

public Resource getResource(){ 
// Some implementation details that call a web service and throw the result in a string... 
String resource = ........ 
} 

Resource класс действительно просто обернуты String, поэтому я решил, что это имело смысл передать его в в конструкторе, так как она является неотъемлемой частью Resource объекта.

public class Resource{ 
    Resource(String theXMLorJSON){ 
    ... 
    } 
} 

Пара вопросов:

  1. Как построить в getResource вызова нового Resource? Я думаю, что я хочу использовать IoC и не вызывать new в методе.
  2. Если другой класс принимает Resource в конструкторе, как я могу использовать контейнер Guice для его построения, когда мне нужно динамическое String во время строительства? Я просто спросил similar question и считаю, что может быть конкретный способ справиться с этим, используя Guice.

Большое спасибо!

ответ

2

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

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

Класс, содержащий метод getResource(), с другой стороны, вы определенно хотите создать контейнер, потому что вы хотите использовать что-то, что зависит от этого класса при тестировании, без фактического вызова веб-службы ,

Обратите внимание, что если у вас есть класс с конструктором, который принимает обе зависимости, которые вы хотите ввести в контейнер, и параметры, которые известны только во время выполнения, вам необходимо создать промежуточную фабрику какого-либо типа с методом, который принимает только параметры времени выполнения. С помощью Guice вы можете автоматически создавать такую ​​фабрику из интерфейса с помощью Assisted Inject (не уверен, что это работает с RoboGuice, но также легко создать такую ​​заводскую реализацию вручную).

+0

Большое спасибо за ответ. Я также в Арлингтоне, штат Вирджиния, кстати. – skaz

+0

Еще пару вопросов, если вы не возражаете. 1) Почему в разделе «Фабрики по рукам» на странице, которую вы связываете, используется «поставщик» вместо «Кредитсервис»? Не удалось ли ввести «Кредитсервис»? 2) Если у меня есть другой класс, ResourceUser, который принимает «Resource» в конструкторе, а конструктор 'Resource' принимает' String', как мне настроить настройку 'ResourceUser' с помощью Guice? Извините, если это наивно ... – skaz

+0

Это сделано, чтобы гарантировать, что завод не изменит область действия «Кредитсервис».Например, «CreditService» может быть запрошенным в веб-приложении, поэтому вам нужно убедиться, что вы получаете правильный экземпляр при каждом вызове фабрики. Если все зависимости являются одиночными, вы можете просто вводить их напрямую ... но вы не должны предполагать, что на заводе. См. [Поставщики инъекций] (http://code.google.com/p/google-guice/wiki/InjectingProviders). – ColinD

Смежные вопросы