В чем разница между Container.Resolve <View>() и новым View ()? - PullRequest
1 голос
/ 01 мая 2019

Сейчас я практикую Призму с "Prism-Samples-Wpf" в Github. (https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/06-ViewActivationDeactivation)

Этот код является частью MainWindow.xaml.cs

public partial class MainWindow : Window
{
    IContainerExtension _container;
    IRegionManager _regionManager;
    IRegion _region;

    ViewA _viewA;
    ViewB _viewB;

    public MainWindow(IContainerExtension container, IRegionManager regionManager)
    {
            InitializeComponent();
            _container = container;
            _regionManager = regionManager;

            this.Loaded += MainWindow_Loaded;
    }
    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
            _viewA = new ViewA();
            _viewB = _container.Resolve<ViewB>();

            _region = _regionManager.Regions["ContentRegion"];
            _region.Add(_viewB);

            _region.Add(_viewA);
    }
}

там возвращают такой же тип, как этот.

(1) new ViewA();                 // ActivationDeactivation.Views.ViewA
(2) _container.Resolve<ViewB>(); // ActivationDeactivation.Views.ViewB

В чем разница между Container.Resolve () и новым ViewA ()?

1 Ответ

0 голосов
/ 01 мая 2019

В чем разница между Container.Resolve<ViewA>() и new ViewA()?

Ничего особенного (кроме new, всегда возвращающего новый экземпляр, тогда как ViewA может быть зарегистрирован как синглтон).

Но представьте себе new SomeService( aDependency, new AnotherDependency(), () => new SomeProduct( new ThirdDependency(), aDependency ) в отличие от Container.Resolve<SomeService>() ...

Unity или любого DI-контейнера, то есть just облегчает жизнь при созданииэкземпляров.Конечно, вы можете делать все вручную, вам не нужно.Будьте осторожны - вы должны , а не ввести контейнер.Скорее, добавьте фабрику, если вам нужно создавать экземпляры на лету.

Пример того, как MainWindow может выглядеть:

public partial class MainWindow : Window
{
    private readonly Func<ViewA> _viewAFactory;
    private readonly Func<ViewB> _viewABFactory;
    IRegionManager _regionManager;
    IRegion _region;

    ViewA _viewA;
    ViewB _viewB;

    public MainWindow(Func<ViewA> viewAFactory, Func<ViewB> viewBFactory, IRegionManager regionManager)
    {
        InitializeComponent();
        _viewAFactory = viewAFactory;
        _viewBFactory = viewBFactory;
        _regionManager = regionManager;

        this.Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
            _viewA = _viewAFactory();
            _viewB = _viewBFactory();

            _region = _regionManager.Regions["ContentRegion"];
            _region.Add(_viewB);

            _region.Add(_viewA);
    }
}

Все это действительно должно произойти в MainWindowViewModel, хоть.Взгляните ViewModelLocator на очень простой способ заставить ваши виды волшебным образом создавать свои модели представлений (правильно разрешенные со всеми зависимостями).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...