2010-08-15 3 views
0

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

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

Edit: (От имени Merlyn Морган-Graham)

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

+0

Я знаю (несколько), что такое локатор сервисов, я знаю, что такое «во время разработки», и я знаю, что такое MVVM, но я не уверен, почему вы ould хочет подключиться к сервисам во время разработки. Какую проблему вы пытаетесь решить здесь? Немного больше контекста может быть полезно для тех, кто пытается найти альтернативы для вас. И если одна и та же настройка и код работали на вас на другом компьютере, это звучит как проблема технической поддержки, а не проблема программирования ..? –

+0

Я добавил редактирование, чтобы я мог дать вам несколько лучше понять! – Peter

+0

@Petoj: где он разбивается, соединение view-> viewmodel или соединение viewmodel-> dal/servicelocator? –

ответ

1

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

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

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

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

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

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

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

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

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

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

0

Обычно вам не нужно обращаться к службам во время разработки ... Как правило, вы не используете свои реальные ViewModels во время разработки, вы используете фиктивные данные дизайна, как объяснено here. Если вам действительно нужно использовать свои реальные 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()); 
} 
+0

ну да, моя цель - использовать фиктивные сервисы, но где я помещаю этот код, который регистрирует службы, чтобы он работал во время разработки? – Peter

+0

Хороший вопрос ... Обычно я запускаю инициализацию службы в методе OnStartup приложения, но этот метод не выполняется во время разработки. Вы уверены, что он не работает с атрибутом DesignTimeBootstrapper, упомянутым в статье Джоша Смита? –

+0

Petoj: Я просто попробовал. не работает для меня :( –

0

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

  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. Используйте Загрузчик, как и раньше в режиме исполнения, например:

    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> 
    
Смежные вопросы