2010-03-04 2 views
3

Я новичок во всей вещи MVP и медленно обнимаю вокруг себя все это. Проблема, с которой я сталкиваюсь, заключается в том, как оставаться в соответствии с методологией MVP при заполнении GridViews (и ddls, но мы будем решать это позже).Как связать данные и манипулировать им в GridView с MVP

Можно ли подключить его прямо к ObjectDataSourceID? Для меня это кажется неправильным, потому что оно обходит все разделение проблем, которые был сделан MVP.

Итак, с учетом сказанного, как мне это сделать? Как обрабатывать сортировку (отправлять ли сообщения обработчикам на уровень представления, если да, как это выглядит в коде)? Прямо сейчас у меня есть GridView, который не сортирует. Код ниже.

ListCustomers.aspx.cs:

public partial class ListCustomers : System.Web.UI.Page, IlistCustomer 
{ 
protected void Page_Load(object sender, EventArgs e) 
{ 
    //On every page load, create a new presenter object with 
    //constructor recieving the 

    // page's IlistCustomer view 
    ListUserPresenter ListUser_P = new ListUserPresenter(this); 

    //Call the presenter's PopulateList to bind data to gridview 
    ListUser_P.PopulateList(); 

} 

GridView IlistCustomer.UserGridView 
{ 
    get { return gvUsers; } 
    set { gvUsers = value; } 
} 

} 

Интерфейс (IlistCustomer.cs): это плохо отправка в целом Gridview контроль?

public interface IlistCustomer 
{ 
GridView UserGridView { set; get; } 
} 

предъявитель (ListUserPresenter.cs):

public class ListUserPresenter 
{ 
private IlistCustomer view_listCustomer; 
private GridView gvListCustomers; 
private DataTable objDT; 

public ListUserPresenter(IlistCustomer view) 
{ 
    //Handle an error if an Ilistcustomer was not sent in) 
    if (view == null) 
     throw new ArgumentNullException("ListCustomer View cannot be blank"); 

    //Set local IlistCustomer interface view 
    this.view_listCustomer = view; 
} 

public void PopulateList() 
{ 
    //Fill local Gridview with local IlistCustomer 
    gvListCustomers = view_listCustomer.UserGridView; 

    // Instantiate a new CustomerBusiness object to contact database 
    CustomerBusiness CustomerBiz = new CustomerBusiness(); 

    //Call CustomerBusiness's GetListCustomers to fill DataTable object 
    objDT = CustomerBiz.GetListCustomers(); 

    //Bind DataTable to gridview; 
    gvListCustomers.DataSource = objDT; 
    gvListCustomers.DataBind(); 
} 
} 

ответ

1

Удобство использования осведомленного управления базой данных, как Gridview, это огромный соблазн. Теоретически можно просто свернуть свой собственный gridview и оставаться верным дизайну MVP. Но вы будете дублировать работу и дать конечным ресурсам бизнеса не часто самый мудрый выбор. Поскольку экономия времени может быть значительной, есть веские основания использовать средства контроля базы данных.

Компромисс заключается в том, чтобы четко документировать по коду путь, по которому элемент управления подключается к базе данных. Таким образом, если и когда вы переносите пользовательский интерфейс, бэкэнд или и то, и другое, вы можете видеть, что зависит от контроля базы данных и бэкэнд. Также просмотрите базу данных apis, предлагаемую вашей инфраструктурой. У вас может быть близкий к универсальному выбору, который минимизирует проблему с изменением внутренних компонентов.

При планировании дизайна ключевой вопрос: «Что произойдет, если я изменю пользовательский интерфейс, презентатор, представление, модель или базу данных. Ответ, надеюсь, приведет вас к дизайну, который позволяет изменять.

+0

А, Возможно, вы не хотите использовать gridviews? Я собираюсь сделать еще несколько исследований по наилучшему способу сделать это в дизайне, который я ищу. Спасибо, что дал мне новый путь к исследованиям. – DotNetDan

+0

Несомненно, но помните, что gridview может быть огромным временным периодом, так что фактор тоже. Пока связь между базой данных с gridview явно документирована, вы должны быть в порядке для будущих выпусков. –

1

интерфейс вид не должен подвергать компоненты пользовательского интерфейса, мое взятие будет следующее

public interface IlistCustomer 
{ 
    PopulateCustomers(IEnumerable<Customer> customers); 
} 

public class ListUserPresenter 
{ 
private IlistCustomer _view; 

public ListUserPresenter(IlistCustomer view) 
{ 
    //Handle an error if an Ilistcustomer was not sent in) 
    if (view == null) 
     throw new ArgumentNullException("view");  

    _view = view; 
} 

public void PopulateList() 
{ 
    //Injecting your DAL seems like a good choice here 
    CustomerBusiness CustomerBiz = new CustomerBusiness();  

    IEnumerable<Customer> customers = CustomerBiz.GetListCustomers(); 

    _view.PopulateCustomers(customers); 
} 
} 
+0

Ты очень прав, Лейю.Я понял, что это было неправильно, когда я это делал, но в то время я не мог найти другого способа быть полноправным парнем. То, что я думал, что я знаю о том, что должно быть в представлении, было неправильным. Я думал, что он не должен делать ничего, кроме как давать предметы, которые должны быть заполнены ведущим. Теперь я понимаю, что взгляд должен делать больше, чем я думал. Спасибо Leyu за ваш вклад. Это было полезно. – DotNetDan

3

Начну, выделив основные проблемы, решаемые MVP в качестве шаблона Прежде всего, это достижение модульность через разделение. Это означает, что в идеале можно изменить слой «Вид», скажем, «Веб-формы» на формы Windows без chnagi ng в слоях Presenter и Model. Во-вторых, приложение, разработанное с использованием MVP, легко поддается модульному тестированию, поскольку очень сложно проверить форму. Имея это в виду, вы понимаете, что объекты View-centric, такие как Grid, не должны обрабатываться на уровне Presenter, поскольку при изменении View, элементы управления также могут измениться. Чтобы ответить на ваш вопрос, я могу подойти к вашей проблеме следующим образом:

// View 
public interface IListCustomersView 
{ 
    public void BindGrid(IList<Customer> customers); 
} 

// Form e.g. Web Form, Windows Form 
public class ListCustomers : IListCustomersView 
{ 
    private ListCustomersPresenter listCustomerPresenter = null; 

    public ListCustomers() 
    { 
     // You can use a Dependency Injector here 
     this.listCustomersPresenter = new ListCustomerPresenter(
      new CustomerRepository(), 
      this); 
    } 

    public void BindGrid(IList<Customer> customers) 
    { 
      grid.DataSource = customers; 
      grid.Databind(); 
    } 
} 

// Presenter 
public class ListCustomersPresenter 
{ 
    private readonly IListCustomersView view = null; 
    private readonly ICustomerRespository repository = null; 

    public ListCustomersPresenter(
     ICustomerRespository customerRepository, IListCustomersView view) 
    { 
     Guard.AgainstNull(view,"View"); 
     Guard.AgainstNull(customerRepository,"CustomerRepository"); 

     this.view = view; 
     this.customerRepository = customerRepository; 
    } 

    public void BindGrid() 
    { 
     // Fetch customers from repository 
     IList<Customer> customers = this.customerRepository.GetCustomers(); 
     view.BindGrid(customers);   
    } 
} 
Смежные вопросы