WPF — MVVM — кто отвечает за новое соединение с поставщиком данных?

Я знаю, что это может быть вопрос «стиля кодирования», но на данный момент я действительно запутался. В настоящее время я пытаюсь следовать шаблону MVVM (ViewModel, Repository, Controller и т.д.).

Но кто должен инициировать подключение к источнику данных? Особенно, когда более чем одному контроллеру требуется активное соединение?

Там не так много возможностей - либо каждый контроллер сам открывает новое соединение, соответствующая ViewModel открывает соединение и передает его в репозиторий, который, в свою очередь, передает его своему контроллеру, - либо соединение создается еще раньше (например, StartUp .cs).

Я знаю, что нет «идеального» решения, но я надеюсь получить вдохновение и, возможно, хорошую/лучшую практику.

Обновление 1

Пример кода:

namespace Question {
class ViewModel {

    Person.Person p;
    Department.Department d;

    Person.PersonRepository pR;
    Department.DepartmentRepository dR;

    // Here in the VM both classes (Person and Department) intersect - should I inject an instance of a "IDataProvider" from here into the Repositorys?
    // If so, I'd have to pass it to the repository which has to pass it to it's controller.
 }
}

namespace Question.Person {
class Person {
    // Person Model
}

class PersonRepository {
    // This class does whatever a repository does and delegates database query to it's controller
}

class PersonController {

    // Or should the Controller itself instantiate a new "IDataProvider" ?

    // This class needs a connection to the databse to execute querys
 }
}

namespace Question.Department {

class Department {
    // Department Model
}

class DepartmentRepository {
    // This class does whatever a repository does and delegates database query to it's controller
}

class DepartmentController {
    // This class needs a connection to the databse to execute querys
 }
}

person Th1sD0t    schedule 29.01.2015    source источник
comment
Зачем вам совместно использовать соединение с базой данных между классами? Просто открывайте и закрывайте, когда это необходимо. Конечно, абстрагируйте логику базы данных с помощью некоторого интерфейса и внедрите ее в те места, где необходимо соединение. Если вы думаете, что я говорю о чем-то другом; тогда, пожалуйста, опубликуйте код. Иначе трудно понять, что ты имеешь в виду.   -  person Sriram Sakthivel    schedule 29.01.2015
comment
Я бы поделился кодом - если бы он существовал. Это больше теоретический вопрос. Конечно, я бы абстрагировал логику базы данных с помощью интерфейса - попытаюсь написать кусок кода, чтобы показать вам то, что я хотел знать.   -  person Th1sD0t    schedule 29.01.2015


Ответы (2)


Я думаю, вы путаете MVC с MVVM:

Обзор MVVMОбзор MVC

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

 public ViewModel()
    {
       Person.PersonRepository pR;
       Department.DepartmentRepository dR;
     }

Или еще лучше внедрить интерфейс репозитория в ваша ViewModel, чтобы получить чистую, развязанную и тестируемую реализацию:

public ViewModel(IPersonRepository personRepo, IDepartmentRepository depRepo)
    {
       Person.PersonRepository pR = personRepo;
       Department.DepartmentRepository dR = depRepo;
     }
person D.Rosado    schedule 29.01.2015
comment
Очень хороший ответ, спасибо! Итак, когда я определяю ViewModel, который ожидает интерфейс репозитория, я должен объявить/создать экземпляр моей ViewModel в коде соответствующего представления, не так ли? С конструктором без каких-либо параметров я могу создать экземпляр ViewModel, встроенный в XAML. - person Th1sD0t; 29.01.2015
comment
Постарайтесь оставить файл view.xaml.cs как можно более пустым, поместите свои модели представления в разные классы. Я бы рекомендовал вам использовать некоторую структуру MVVM, чтобы помочь вам с шаблоном, например MVVM Light. Также обратите внимание на такие примеры, как apuntanotas.codeplex.com. - person D.Rosado; 29.01.2015

Я думаю, вы неправильно понимаете шаблон MVVM. Прочтите эту статью:

https://msdn.microsoft.com/en-us/magazine/dd419663.aspx

Это должно помочь лучше понять MVVM.

ОБНОВЛЕНИЕ:

Открытое соединение с репозиторием. Если вы используете ORM для доступа к базе данных (EF, NHibernate), они обычно используют пул соединений. Если вы не используете ORM, вы можете реализовать пул.

http://martinfowler.com/eaaCatalog/repository.html — в этой статье описывается шаблон "Репозиторий" . Он реализовал коллекционно-подобный интерфейс и скрыл особенности доступа к данным. Следовательно, внутри репозитория должно быть создано соединение.

person sribin    schedule 29.01.2015
comment
Спасибо за ссылку, это действительно интересно, но я не понимаю, почему я должен неправильно понимать MVVM - приведенный выше код, как уже упоминалось, не что иное, как фиктивный пример, показывающий вам то, что я хотел знать. Я знаю, что в MVVM нет правила или что-то в этом роде. - person Th1sD0t; 29.01.2015