Вызывать CRUD-методы репозитория из Controller или ViewModel? - PullRequest
0 голосов
/ 12 сентября 2010

Вот как Джош Смит выполняет процедуру добавления клиента:

**CustomerViewModel**.cs:
    public void Save()
    {   
       _customerRepository.AddCustomer(_customer);
    }

        **CustomerRepository**.cs:
        public void AddCustomer(Customer customer)
                {
        //...
                        _customers.Add(customer);

                        if (this.CustomerAdded != null)
                            this.CustomerAdded(this, new CustomerAddedEventArgs(customer));

                }

        **AllCustomersViewModel**.cs(acts as Controller):
        void OnCustomerAddedToRepository(object sender, CustomerAddedEventArgs e)
                {
                    var viewModel = new CustomerViewModel(e.NewCustomer, _customerRepository);
                    this.AllCustomers.Add(viewModel);
                }

сильный текст Не лучше ли это сделать?:

 **CustomerViewModel**.cs:
public void Save()
{   
   if (this.CustomerAdded != null)
                        this.CustomerAdded(this, new CustomerAddedEventArgs(customer));
}   

    AllCustomersViewModel.cs(acts as Controller):
    void OnCustomer**ADDING**ToRepository(object sender, CustomerAddedEventArgs e)
            {
                _customerRepository.Add(e.NewCustomer);
                var viewModel = new CustomerViewModel(e.NewCustomer);
                this.AllCustomers.Add(viewModel);
            }

Этот шаг в CustomerViewModel.cs также может находиться в Контроллере, поскольку Контроллер хранит 1 / все ссылки на Сервис / Репозиторий Клиента / Продукта / Заказа и т. Д. *

if (this.IsNewCustomer)
                _customerRepository.AddCustomer(_customer);

Когда у меня все еще есть Order / ProductViewModel, работающая на тот же контроллер, у меня есть 3 экземпляра хранилища.Если хранилище будет в экземпляре Ctor контроллера, у меня есть только ОДИН экземпляр.

С архитектурой Джоша Смита у вас есть customerRepo в Controller AND CustomerViewModel.

С моей идеей у вас есть толькоОДИН customerRepo в контроллере И метод Save / Add CustomerViewModel можно подписать на метод Controllers OnAddCustomer.

Почему Джош Смит взял

public event EventHandler<CustomerAddedEventArgs> CustomerAdded;

, а не

simple public Action<Customer> AddDocumentDelegate;

Как вы думаете?Видите ли вы какие-либо недостатки в моей идее?

1 Ответ

0 голосов
/ 12 сентября 2010

Ваша идея верна. ViewModel должен быть представлением конкретной модели вашего представления, и он не должен вызывать ваши репозитории. Ваш контроллер может прослушивать события из вида (нажатие кнопки, отправка и т. Д.), А затем вызывать репозитории.

Есть другие сообщения на эту тему, которые вы должны проверить -

http://www.weask.us/entry/mvvm-put-data-access-layer

MVVM, куда поместить Уровень доступа к данным?

...