Unity Dependency Injection (конструктор или свойство) - PullRequest
2 голосов
/ 23 января 2012

Я уже давно использую Unity в своем проекте.У меня есть одноэлементный контейнер, который я использую для регистрации типов и / или экземпляров, а затем разрешаю.

сегодня я хотел автоматизировать некоторые экземпляры с помощью внедрения свойства или конструктора.

Я начал с класса Logger.При запуске приложения у меня есть этот код:

RegisterType<Logger, Logger>();

, чем в моей ViewModel

[Dependency]
    public Logger MyLogger {
        get;
        set;
    }

, вот как я создаю экземпляр модели представления, которая имеет это свойство (в MainWindow.xaml.cs)

private void InitializeViewModel() {
    _vm = new MainViewModel(MainGrid);
    ...
    MyContainer.GetInstance().Container.RegisterInstance<MainViewModel>(_vm);

Я не могу заставить этот [имущественный инжектор] работать.НЕОБХОДИМО ли сопряжение свойств с парой в конструкторе?Я уже использую конструктор, который имеет некоторые параметры ..

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Что-то не так в вашем примере.Если вы хотите, чтобы Logger был введен в MainViewModel, вы должны позволить контейнеру создать MainViewModel для вас.

Однако в своем коде вы создаете его самостоятельно.Когда я смотрю на это, оно должно быть:

_vm = Container.Resolve<MainViewModel>();

или, по крайней мере,

_vm = new MainViewModel();
Container.BuildUp( _vm ); 
1 голос
/ 23 января 2012

Вместо того, чтобы использовать new MainViewModel() для создания модели представления, вам нужно, чтобы ваш Unity Container делал создание.

Container.RegisterType<MainViewModel>(
     new ContainerControlledLifetimeManager(),
     new InjectConstructor(MainGrid)
   );

И затем вы можете использовать Container.Resolve<MainViewModel>(), чтобы получить свой синглтон, ранее известный как _vm.

Примечание: Часть ContainerControlledLifetimeManager говорит Unity, что нужно создать только один экземпляр MainViewModel и вернуть его для всего.

...