Я пытаюсь спроектировать приложение реализующее паттерн 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 не вариант.
Ответ
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
{
IEnumerable
Customer GetCustomer(int id);
...
}
Реализация репозитория
internal class CustomerRepository : ICustomerRepository
{
private readonly DbContext dbContext = new DbContext();
IEnumerable
Customer GetCustomer(int id)
{
return dbContext.Set
...
}
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
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: В коде могут быть ошибки, т.к. часть кода писал прямо тут, но для объяснения концепции этого должно быть достаточно.
Комментариев нет:
Отправить комментарий