Как связать данные и манипулировать ими в GridView с MVP - PullRequest
3 голосов
/ 04 марта 2010

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

Можно ли подключить его напрямую к 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();
}
}

Ответы [ 3 ]

3 голосов
/ 17 сентября 2010

Я начну с выделения основных проблем, рассматриваемых MVP, в качестве шаблона. Во-первых, это достижение модульности путем разделения интересов. Это означает, что в идеале можно изменить слой просмотра, скажем, с веб-форм на формы Windows, не изменяя ничего в слоях Presenter и Model. Во-вторых, приложение, разработанное с использованием MVP, легко поддается модульному тестированию, поскольку очень трудно протестировать форму. Имея это в виду, вы понимаете, что объектам, ориентированным на представление, таким как 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);          
    }
}
1 голос
/ 01 апреля 2010

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

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);
}
}
1 голос
/ 09 марта 2010

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

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

При планировании дизайна ключевой вопрос, который нужно задать, это «Что произойдет, если я изменю пользовательский интерфейс, докладчика, представление, модель или серверную часть базы данных. Надеемся, что ответ приведет вас к дизайну, который учитывает изменения» 1005 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...