Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVP中如何在演示者和数据服务之间传输数据_C#_Design Patterns_Mvp - Fatal编程技术网

C# 在MVP中如何在演示者和数据服务之间传输数据

C# 在MVP中如何在演示者和数据服务之间传输数据,c#,design-patterns,mvp,C#,Design Patterns,Mvp,我是MVP模式的初学者,只想知道关于以下案例的最佳实践 为了更好地理解,我将通过一个例子来提问。假设我们有一个表单EmployeeView,EmployeePresenter,EmployeeModel和一个DataService类,它封装了GetEmployeeByID()方法。对于这个演示,我使用具体的类 假设现在在win forms应用程序中,我们希望通过ID搜索员工,因此我们在视图中输入ID,然后按搜索按钮。在这种情况下,演示者将更新员工模型,可能会使用反射。(此时只有'Employee

我是MVP模式的初学者,只想知道关于以下案例的最佳实践

为了更好地理解,我将通过一个例子来提问。假设我们有一个表单
EmployeeView
EmployeePresenter
EmployeeModel
和一个
DataService
类,它封装了
GetEmployeeByID()
方法。对于这个演示,我使用具体的类

假设现在在win forms应用程序中,我们希望通过
ID
搜索员工,因此我们在视图中输入
ID
,然后按搜索按钮。在这种情况下,
演示者将更新
员工模型
,可能会使用反射。(此时只有'
EmployeeModel.ID
'属性有数据)。然后,
演示者将与
数据服务
对话。这可以通过两种方式实现

  • 这里我们将
    模型
    传递给
    数据服务
    ,然后它将更新相同的模型并返回到
    演示者
  • 班级雇员代表 {

    }

    类数据服务 {

    }

  • 这里我们只传递
    模型
    的属性值,然后
    数据服务
    将创建一个
    模型
    ,并返回到
    演示者
  • 班级雇员代表 {

    }

    类数据服务 {

    }

  • 以上哪一项是可以接受的
  • 例如,如果两个实体(例如,雇员和工资实体)的细节显示在一个视图上,我们会把这些实体看作两个模型还是作为一个单一的模型,比如<代码>员工手册< /代码>?如果它有两个模型,我们需要两个演示者吗
  • DataService
    是否应始终返回业务模型?不能
    DataService
    返回
    stings
    数据集
  • 演示者能否在视图上设置值,如
    \u view.EmployeeName=EmployeeModel.Name
  • 第二个选项会更好,因为您的方法被称为
    GetEmployeeByID
    ,期望参数
    Id
    而不是整个模型更符合逻辑

  • 与这里的ASP.NET MVC不同,您不需要将模型作为单个类传递给视图,因此可以保留两个模型以获得更好的语义结构

  • 这取决于你想要达到的目标。同样,如果您的方法被调用为
    GetEmployeeByID
    ,它将返回类型为
    Employee
    的业务模型。您的服务可以返回“字符串或数据集”,但这意味着您需要在Presenter中进行额外的映射,以便将数据集映射到您的模型

  • 是的,演示者可以设置如下值
    \u视图。EmployeeName=EmployeeModel.Name
    您需要实现
    \u视图.EmployeeName
    设置
    访问修饰符以呈现某些控件中的文本,如

    public EmployeeName
    {
        set
        {
            // Label Control
            this.lblEmployeeName.Text = value;
        }
    }
    

  • 但在某些情况下,通过演示者设置值只会使其更加复杂,没有任何特殊的好处。在这些情况下,您可以使用用户监控控制器,这是MVP的一个子类型,其中一些与业务逻辑无关的基本呈现保留在视图中,而更复杂的逻辑则在演示者/控制器中完成。您可以在此处找到相关信息:

    还有另一个称为被动视图的子类型,其中视图仅包含控件,演示者负责将值传递给视图。您可以在此处阅读:

    编辑:您还可以查看此答案,了解这两个子类型的简要信息: 编辑: 这是被动视图代码。 我们希望能够从一种表单类型(Windows.Forms、Gtk.Forms等)切换到另一种表单类型,并且希望能够在将来轻松地从hibernate切换到ado.net或其他类型

    我更喜欢采用固定参数的混合方法和采用搜索参数列表的通用方法

    例如,GetSomethingByID只会获取一个int作为参数并返回一个模型

    但当我需要搜索地址时(至少有两个表被调用)。保存地址数据的一种,如addressno.,searchname等。另一个表包含name1,name2,等等。然后我会得到一个包含大量参数的方法。 在这一点上,我不会扩展这两个表中的任何一个

    我们不喜欢参数超过4个的方法。因此,我们创建了一个“QueryMethodParameter”对象,我们从视图中使用它。 我将举一个例子,对我来说,展示比解释我们所做的更容易

    在我们的视图中搜索地址时会执行此操作

    p.Items.Add(new QueryMethodParameterItem("Address", "AddressNumber", addressNumber));
    p.Items.Add(new QueryMethodParameterItem("Address", "Searchname", searchName));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Name1", name1));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Name2", name2));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Name3", name3));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Street", street));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Zipcode", zipcode));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Location", location));
    ((AddressSearchPresenter)this.Presenter).DoAddressSearch(p);
    
    演讲人

    public void DoAddressSearch(QueryMethodParameter p)
    {
      IAddressService addrService = (IAddressService)ApplicationController.GetInstance().ServiceFactory.GetService(typeof(Model.Address), this.ServiceContext);
      IListEx<Model.Address> erg = addrService.LoadAddresses(p);
      this.SetModel(erg);
      _viewItems = new AddressSearchViewItems(erg);
      this.ModelToView();
    }
    
    public void DoAddressSearch(QueryMethodParameter p)
    {
    IAddressService addrService=(IAddressService)ApplicationController.GetInstance().ServiceFactory.GetService(typeof(Model.Address),this.ServiceContext);
    IListEx erg=addrService.LoadAddresses(p);
    该模型(erg);
    _viewItems=新地址SearchViewItems(erg);
    这个.ModelToView();
    }
    
    地址服务

    public IListEx<Model.Address> LoadAddresses(QueryMethodParameter p)
    {
      ICriteria ca = this.ServiceFactory.CreateCriteria(this.Context, typeof(Model.Address));
      ICriteria ma = null;
    
      for (int i = 0; i < p.Items.Count; i++)
      {
        object val = p.Items[i].Value;
        if (val == null)
        {
          throw new NullReferenceException();
        }
    
        if (val.GetType() == typeof(string))
        {
          if (!val.ToString().EndsWith("%"))
          {
            val = val.ToString() + "%";
          }
    
          if (!val.ToString().StartsWith("%"))
          {
            val = "%" + val.ToString();
          }
        }
    
        if (p.Items[i].ModelName == "Address")
        {
          ca.Add(Expression.Like(p.Items[i].PropertyName, val));
        }
        else if (p.Items[i].ModelName == "MailingAddress")
        {
          if (ma == null)
          {
            ma = ca.CreateCriteria("MailingAddress", "MailingAddress");
          }
    
          ma.Add(Restrictions.Like(p.Items[i].ModelName + "." + p.Items[i].PropertyName, val));
        }
        else
        {
          throw new NotImplementedException();
        }
      }
    
      ca.Add(Expression.Gt("AddressID", 0));
    
      return ca.ListEx<Model.Address>();
    }
    
    公共IListEx加载地址(QueryMethodParameter p)
    {
    ICriteria ca=this.ServiceFactory.CreateCriteria(this.Context,typeof(Model.Address));
    ICriteria-ma=null;
    对于(int i=0;ipublic EmployeeName
    {
        set
        {
            // Label Control
            this.lblEmployeeName.Text = value;
        }
    }
    
    p.Items.Add(new QueryMethodParameterItem("Address", "AddressNumber", addressNumber));
    p.Items.Add(new QueryMethodParameterItem("Address", "Searchname", searchName));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Name1", name1));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Name2", name2));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Name3", name3));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Street", street));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Zipcode", zipcode));
    p.Items.Add(new QueryMethodParameterItem("MailingAddress", "Location", location));
    ((AddressSearchPresenter)this.Presenter).DoAddressSearch(p);
    
    public void DoAddressSearch(QueryMethodParameter p)
    {
      IAddressService addrService = (IAddressService)ApplicationController.GetInstance().ServiceFactory.GetService(typeof(Model.Address), this.ServiceContext);
      IListEx<Model.Address> erg = addrService.LoadAddresses(p);
      this.SetModel(erg);
      _viewItems = new AddressSearchViewItems(erg);
      this.ModelToView();
    }
    
    public IListEx<Model.Address> LoadAddresses(QueryMethodParameter p)
    {
      ICriteria ca = this.ServiceFactory.CreateCriteria(this.Context, typeof(Model.Address));
      ICriteria ma = null;
    
      for (int i = 0; i < p.Items.Count; i++)
      {
        object val = p.Items[i].Value;
        if (val == null)
        {
          throw new NullReferenceException();
        }
    
        if (val.GetType() == typeof(string))
        {
          if (!val.ToString().EndsWith("%"))
          {
            val = val.ToString() + "%";
          }
    
          if (!val.ToString().StartsWith("%"))
          {
            val = "%" + val.ToString();
          }
        }
    
        if (p.Items[i].ModelName == "Address")
        {
          ca.Add(Expression.Like(p.Items[i].PropertyName, val));
        }
        else if (p.Items[i].ModelName == "MailingAddress")
        {
          if (ma == null)
          {
            ma = ca.CreateCriteria("MailingAddress", "MailingAddress");
          }
    
          ma.Add(Restrictions.Like(p.Items[i].ModelName + "." + p.Items[i].PropertyName, val));
        }
        else
        {
          throw new NotImplementedException();
        }
      }
    
      ca.Add(Expression.Gt("AddressID", 0));
    
      return ca.ListEx<Model.Address>();
    }