我们假设我有一个名为TrainingPlan
的域对象。 TrainingPlan
对象由其他域对象组成,如下所示:
public class TrainingPlan
{
public DelegateInfo DelegateInfo { get; set; } // name, assessor, course name
public IEnumerable<Test> Tests { get; set; } // tests delegate undertook
public IEnumerable<Comment> Comments { get; set; } // comments by assessor
}
我创建了3个.ascx
控件:
DelegateInfo.ascx
Test.ascx
(显示单个测试域对象的信息)
Comment.ascx
(显示单个评论域对象的信息)
使用视图声明每个ascx
控件:
public partial class TestControl : System.Web.UI.UserControl, ITestView
{
// ... implementation of view interface here. Simple properties
}
我的演示者是视图和域对象之间的中间人:
public class TestPresenter: ITestPresenter
{
ITestView _view;
ITest _domainObj;
// Test object in domain implements ITest
public TestPresenter(ITestView view, ITest domainObj)
{
// removed: checks for null etc
_view = view;
_domainObj = domainObj;
}
// etc etc
}
域对象是将数据提供给演示者的对象,并通过演示者从视图接收更新的输入。它将验证数据(因此它在域层中的原因。)
问题:
演示者是否在MVP中直接与域对象对话?我已经使用Google搜索并且在示例中,演示者直接访问模型,但是具有内置业务逻辑的域对象呢?
下面的逻辑是否符合MVP模式?
// Page_Load of PageThatDisplaysTrainingPlan.aspx:
// load full trainingPlan object
var trainingPlan = repository.LoadTrainingPlan(idOfPlan);
// populate test controls
foreach(var test in trainingPlan.Tests)
{
// create test.acx control on this line. Code not added as it is unnecessary
var pres = new TestPresenter(controlJustAdded, test);
// ... add pres to some collection somewhere
}
欢迎使用示例代码的任何建议或链接。
答案 0 :(得分:0)
是的,在MVP模式中,演示者直接使用模型,它绝对正常。具有内置业务逻辑的域对象也是正常的。
关于你的第二个问题 - TestPresenter必须负责从数据库加载trainingPlan对象,以及用新创建的控件更新UI。好像你已将此代码放入Page_Load事件处理程序中,我认为这不是一个好主意,它看起来像SmartUI反模式。