У меня есть решение, которое использует Autofac , и я переместил некоторые методы из моей модели представления в файл сервиса. Прямо сейчас я сталкиваюсь с проблемой, когда некоторые переменные в методах службы и ссылаются на свойства VM. Поэтому я понял, что, возможно, мне следует передать модель представления в службу.
Прежде всего, я не уверен, что должен делать это для разделения слоев и тестируемости. Но я предполагаю, что с насмешками не должно быть проблем, поправьте меня, если я ошибаюсь.
Другое дело, что я еще не уверен, как передать виртуальную машину в службу. С моим текущим решением, которое вы можете найти ниже, я получаю исключение StackOverflow
на установщика модели. Дело в том, что сейчас это лучшее, что у меня есть, и у меня нет новых идей.
Другое дело, если передача виртуальной машины на уровень сервиса является антипаттерном, как мне ссылаться на свойство виртуальной машины на уровне сервиса? Должен ли я создать для этого какую-нибудь оболочку, чтобы виртуальная машина и служба ссылались на нее?
Код будет показан на упрощенном примере. MainViewModel
public class MainViewModel : ViewModelBase
{
private MainViewModel _vm;
private Person _person;
private ISomeService _someService;
public MainViewModel(ISomeService someService)
{
_person = new Person();
_someService = someService;
Name = "Slim Shady";
_vm = new MainViewModel(_someService);
Execute();
}
public string Name
{
get
{
return _person.Name;
}
set
{
_person.Name = value;
OnPropertyChanged();
}
}
private void Execute()
{
string dupa = _someService.GetTheName(_vm);
System.Windows.MessageBox.Show(dupa);
}
}
Модель
public class Person
{
public string Name { get; set; }
}
Услуги
public interface ISomeService
{
string GetTheName(ViewModel.MainViewModel _vm);
}
public class SomeService : ISomeService
{
public string GetTheName(MainViewModel _vm)
{
return _vm.Name;
}
}
Autofac
public class BootStrapper
{
public IContainer BootStrap()
{
var builder = new ContainerBuilder();
builder.RegisterType<SomeService>()
.As<ISomeService>().SingleInstance();
builder.RegisterType<MainWindow>().AsSelf();
builder.RegisterType<MainViewModel>().AsSelf().SingleInstance();
return builder.Build();
}
}
UPDATE
Нужно также рассмотреть ситуацию, когда некоторые другие сервисы также будут ссылаться на имя свойства Person.