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