#c_sharp #winforms #entity_framework #mvp
Я пытаюсь спроектировать приложение реализующее паттерн MVP на WinForms. При этом я использую EF+CodeFirst+Linq На View есть DataGridView, который нужно заполнить данными. View вызывает метод Select() класса Presenter, который в свою очередь вызывает метод Select() класса Model. Как правильно предать полученные из БД данные обратно в Presenter, чтобы тот вставил их во View? Через возврат значения не получается т.к. используется using. Отказываться от using? Реализация Model.Select() internal void Select() { using (GoodsContext context = new GoodsContext()) { var items = from Items in context.Goods select Items; } } UPD: Уходить от Linq не вариант.
Ответы
Ответ 1
Model Entity: public class Customer { public string Name { get; set; } public string Address { get; set; } public string Phone { get; set; } public override bool Equals(object obj) { Customer other = obj as Customer; return Equals(other); } public override int GetHashCode() { return Name.GetHashCode() ^ Address.GetHashCode() ^ Phone.GetHashCode(); } public bool Equals(Customer other) { if (other == null) return false; return this.Name == other.Name && this.Address == other.Address && this.Phone == other.Phone; } } //На самом деле для объяснения не было необходимости расписывать поля и переопределять методы, но решил добавить, т.к. многие это не делают, и еще хуже не знают зачем Интерфейс репозитория: public interface ICustomerRepository { IEnumerableGetAllCustomers(); Customer GetCustomer(int id); ... } Реализация репозитория internal class CustomerRepository : ICustomerRepository { private readonly DbContext dbContext = new DbContext(); IEnumerable GetAllCustomers() { return dbContext.Set ().ToList(); } Customer GetCustomer(int id) { return dbContext.Set ().SingleOrDefault(e => e.Id == id) } ... } Presenter public class CustomerPresenter { private readonly ICustomerView _view; private readonly ICustomerRepository _repository; public CustomerPresenter(ICustomerView view, ICustomerRepository repository) { _view = view; view.Presenter = this; _repository = repository; UpdateCustomerListView(); } private void UpdateCustomerListView() { var customerNames = from customer in _repository.GetAllCustomers() select customer.Name; int selectedCustomer = _view.SelectedCustomer >= 0 ? _view.SelectedCustomer : 0; _view.CustomerList = customerNames.ToList(); _view.SelectedCustomer = selectedCustomer; } public void UpdateCustomerView(int p) { Customer customer = _repository.GetCustomer(p); _view.CustomerName = customer.Name; _view.Address = customer.Address; _view.Phone = customer.Phone; } ... } View интерфейс вьюхи public interface ICustomerView { IList CustomerList { get; set; } int SelectedCustomer { get; set; } string CustomerName { get; set; } string Address { get; set; } string Phone { get; set; } Presenter.CustomerPresenter Presenter { set; } } Реализация интерфейса вьюхи internal partial class CustomerForm : Form, ICustomerView { private bool _isEditMode = false; public CustomerForm() { InitializeComponent(); } public IList CustomerList { get { return (IList )this.customerListBox.DataSource; } set { this.customerListBox.DataSource = value; } } public int SelectedCustomer { get { return this.customerListBox.SelectedIndex; } set { this.customerListBox.SelectedIndex = value; } } public string Address { get { return this.addressTextBox.Text; } set { this.addressTextBox.Text = value; } } public string CustomerName { get { return this.nameTextBox.Text; } set { this.nameTextBox.Text = value; } } public string Phone { get { return this.phoneTextBox.Text; } set { this.phoneTextBox.Text = value; } } public Presenter.CustomerPresenter Presenter { private get; set; } private void customerListBox_SelectedIndexChanged(object sender, EventArgs e) { try { Presenter.UpdateCustomerView(customerListBox.SelectedIndex); } catch(Exception e) { //логирование ошибки } } } PS: В коде могут быть ошибки, т.к. часть кода писал прямо тут, но для объяснения концепции этого должно быть достаточно.
Комментариев нет:
Отправить комментарий