DI именно в вашем случае не при чём. Это способ реализации, а не сама идея. Идея состоит в том, что вам нужно реализовать принцип инверсии зависимостей. То есть начать работать с интерфейсами, а не с конкретными реализациями.
Чтобы быть универсальным и переносимым, модуль не должен знать о моделях извне себя. Вместо этого он должен выражать свои требования в виде интерфейса, а внешние модели этот интерфейс должны реализовывать.
Для вашего примера делаем в модуле Article делаем интерфейсы:
interface ArticleInterface
{
public function getTitle();
public function getAuthor();
}
interface ArticleAuthorInterface
{
public function getName();
public function getID();
}
Далее в пределах модуля используем только интерфейсы, а не сами модели:
public function renderArticle(ArticleInterface $article)
{
return $this->renderPartial('_article', [
'author' => $article->getAuthor(),
'title' => $article->getTitle()
]);
}
Вне модуля нам придётся реализовать интерфейсы в моделях:
class Article extends ActiveRecord implements ArticleInterface
{
// ...
}