Чтобы ответить на вопросы 1 и 4
В вашем примере модель представления имеет тип QuestionnaireViewModel
, который является конкретным классом.Поскольку это конкретный класс, когда вы разрешаете представление с помощью container.Resolve<QuestionnaireView>()
, Unity создает для вас модель представления, вызывая container.Resolve<QuestionnaireViewModel>()
за кулисами.
В этом случае регистрация вашей модели представления является избыточной.Однако при использовании внедрения зависимостей обычно требуется работать с интерфейсами, а не с классами, поэтому ваш конструктор будет выглядеть следующим образом:
public QuestionnaireView(IQuestionnaireViewModel viewModel)
{
this.DataContext = viewModel;
}
Теперь, когда ваш конструктор получает интерфейс, а не класс в качестве параметра, Unityне знает, какую реализацию интерфейса вы хотели бы использовать.Чтобы сообщить Unity об этом, вам необходимо зарегистрировать вашу модель представления в контейнере:
container.RegisterType<IQuestionnaireViewModel, QuestionnaireViewModel>();
, поэтому теперь, когда вы разрешите представление, Unity будет искать, какой класс он должен использовать в качестве реализации IQuestionnaireViewModel
, см.что это QuestionnaireViewModel
и используйте его.
Чтобы ответить на вопрос 2
Используется Unity, так как для того, чтобы конструктор получил его параметры, вам нужно разрешить представление, используя контейнер,Unity не используется, если вы сами создаете представление, используя new QuestionnaireView()
, т.е. не будет никакого внедрения конструктора или свойства.
Чтобы ответить на вопрос 3
Я думаю, что это в основном вопрос того, что более удобнои где вам нужно использовать введенные элементы.Много раз вы просто хотите установить локальную переменную в конструкторе, а не создавать свойство только для выполнения внедрения.
Одна хорошая вещь о внедрении свойства - это то, что вы можете использовать container.BuildUp()
метод для экземпляров, которые были созданы с использованием new
вместо container.Resolve<>()
.Таким образом, вы можете вставлять элементы в свойства даже после создания, чего вы не можете сделать с помощью инжектора конструктора.