Правильно ли я делаю внедрение зависимостей в код активности? - PullRequest
0 голосов
/ 10 декабря 2018

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

На данный момент это код моего SplashActivity:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        Fragment fragmentToDisplay = null;
        if (!(getIntent().getBooleanExtra("isLaunch", true))) {
            fragmentToDisplay = new LoginFragment();
        } else {
            if (savedInstanceState == null) {
                fragmentToDisplay = new SplashFragment();
            }
        }
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToDisplay).commit();
    }
}

В зависимости от содержимого IntentExtra "isLaunch" Я хочу отобразить другой фрагмент.Теперь я прочитал, что каждый new ServiceXY() делает код менее тестируемым, что на самом деле не является целью внедрения зависимости.Поэтому я реорганизовал свой код следующим образом:

public class SplashActivity extends AppCompatActivity {

    private SplashFragment splashFragment;
    private LoginFragment loginFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        splashFragment = new SplashFragment();
        loginFragment = new LoginFragment();

        Fragment fragmentToDisplay = null;
        if (!(getIntent().getBooleanExtra("isLaunch", true))) {
            fragmentToDisplay = loginFragment;
        } else {
            if (savedInstanceState == null) {
                fragmentToDisplay = splashFragment;
            }
        }
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragmentToDisplay).commit();
    }
}

Однако, похоже, это не имеет большого значения.Как это улучшает тестируемость моего кода, если я хочу проверить, отображается ли правильный фрагмент?Спасибо вперед.

1 Ответ

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

Вы правы, ваше изменение не имеет большого значения и не вводит зависимость.Поскольку ваш объект SplashActivity отвечает за создание фрагментов, они по-прежнему зависят от объекта SplashActivity.

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

Следуя принципу внедрения зависимостей, ваш сервис будеттип фрагмента, клиент, который использует сервис, будет SplashActivity, и, следовательно, вам нужен другой объект, который «внедрит» правильный сервис в клиент.https://stackify.com/dependency-injection/

Вы можете использовать код из первого фрагмента, но вместо проверки логического значения в oncreate для установки правильного типа фрагмента, вы можете просто передать объект фрагмента в класс splashactivity и перейти fragmentToDisplay = fragmentPassedIntoClass.Затем вы можете проверить, является ли фрагмент, переданный в класс, правильным типом и правильно ли запущена транзакция.Инжектор будет отвечать за прохождение правильного fragmentPassedIntoClass

MainFragment fragment;
if(splash){ fragment = new SplashFragment(); }
if(login){fragment = new LoginFragment(); }

// Pass fragment variable into splash activity
SplashActivity activty = new SplashActivity(fragment);

public class SplashActivity{
    MainFragment mFragment;

    public SplashActivty(MainFragment fragment){
        mFragment = fragment;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...