MVVM настройка времени проектирования услуг? - PullRequest
0 голосов
/ 16 августа 2010

Я работаю с шаблоном MVVM + простая реализация ServiceLocator, теперь к моей проблеме, как мне настроить службы, когда представления выполняются во время разработки?

Iv пробовал это , но, похоже, он не работает в VS 2010 или что-то в этом роде, я знаю, что он работал на моем старом компьютере, но на моем новом - нет. так кто-нибудь знает хорошую альтернативу?

Редактировать: (от имени Мерлин Морган-Грэм)

Что я пытаюсь сделать, так это то, что у меня есть точка зрения, ViewModel и сервисы, теперь разница в том, что у меня есть 2 реализации каждого сервиса, один для времени разработки и один для времени выполнения. для лучшего объяснения смотрите здесь .

Ответы [ 3 ]

1 голос
/ 16 августа 2010

Если вы хотите отделить ваше представление от вашей модели представления и вашу модель представления от вашей модели / dal (в основном, если вы хотите использовать MVVM), то ваша модель представления и модель данных не должны ничего знать о времени разработки.Время разработки относится только к представлению.

В этой статье показан способ определения данных времени разработки с помощью XML / XAML, поэтому вашему нижеследующему коду ничего об этом не нужно знать:

http://karlshifflett.wordpress.com/2009/10/21/visual-studio-2010-beta2-sample-data-project-templates/

После редактирования : Оказывается, вам все равно придется использовать модель представления для работы существующих привязок XAML.Это будет просто заполнять модель представления, а не создавать новую модель данных.Я не уверен, но могут быть классы, которые позволяют вам использовать механизм привязки WPF, чтобы позаботиться об этом ... Представления?

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

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

Для этого вы можете использовать статические конструкторы ваших представлений для регистрации ваших служб времени разработки.Вы также можете написать статический метод в каком-то другом классе (приложении?) Для (условно) регистрации сервисов времени разработки.Затем вызовите этот метод в конструкторе ваших представлений.

Или вы можете просто зарегистрировать их в конструкторе для каждого из ваших представлений.

В принципе то, что вы хотите сделать, возможно, ноэтот метод, указанный в первой статье, не является таковым.Если вы прочитаете дальше в комментариях, вы увидите, что его метод не работает.

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

0 голосов
/ 03 декабря 2014

Кроме того, я согласен со всеми, кто обеспокоен использованием локатора службы во время разработки. Я считаю, что в некоторых случаях это допустимый сценарий. Это не обсуждение того, почему / почему нет, это просто способ, которым он (почти) работал для меня. Есть еще проблема, которую я еще не решил: она работает только для одного вида за раз.

  1. Создайте простой загрузчик для настройки IoC по вашему выбору. Обратите внимание на интерфейс ISupportInitialize.

    public class Bootstrapper: ISupportInitialize
    {
        #region ISupportInitialize Members
    
        public void BeginInit() { }
    
        public void EndInit()
        {
            if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
                Setup();
        }
    
        #endregion
    
        public static void Setup() { SetupServiceLocator(); }
    
        static void SetupServiceLocator()
        {
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterType<ConfigService>().As<IConfigService>().ExternallyOwned().SingleInstance();
            IContainer container = builder.Build();
    
            ServiceLocator.SetLocatorProvider(() => new AutofacServiceLocator(container));
        }
    }
    
  2. Используйте Bootstrapper, как и раньше, для режима выполнения, например ::

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            Bootstrapper.Setup();
        }
    }
    
  3. Дополнительно необходимо добавить его в ресурсы приложения для поддержки режима разработки:

    <Application x:Class="MonitoringConfigurator.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:MyBootstrapperNamespace"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
            <local:Bootstrapper x:Key="Bootstrapper" />
        </Application.Resources>
    </Application>
    
0 голосов
/ 16 августа 2010

Обычно вам не требуется доступ к службам во время разработки ... Как правило, вы даже не используете свои настоящие ViewModels во время разработки, вы используете фиктивные данные проекта, как объяснено здесь, Если вам действительно нужно использовать ваши настоящие ViewModels, вы можете реализовать фиктивные версии своих сервисов и использовать их вместо реальных сервисов:

if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
{
    // Design time
    ServiceLocator.Instance.Register<IService1>(new DummyService1());
    ServiceLocator.Instance.Register<IService2>(new DummyService2());
}
else
{
    // Run time
    ServiceLocator.Instance.Register<IService1>(new RealService1());
    ServiceLocator.Instance.Register<IService2>(new RealService2());
}
...