C# linqtosql设计与MVP
我正在试验LinqToSql和MVP模式,在设置好的设计时遇到了困难。我使用的是Asp.NET3.5(不是MVC) 这里有一个例子C# linqtosql设计与MVP,c#,asp.net,linq-to-sql,mvp,C#,Asp.net,Linq To Sql,Mvp,我正在试验LinqToSql和MVP模式,在设置好的设计时遇到了困难。我使用的是Asp.NET3.5(不是MVC) 这里有一个例子 public interface IMyBusinessCardView { string Field1 { get; set; } string Field2 { get; set; } string Field15 { get; set; } } public class MyBusinessCardPresenter { pr
public interface IMyBusinessCardView
{
string Field1 { get; set; }
string Field2 { get; set; }
string Field15 { get; set; }
}
public class MyBusinessCardPresenter
{
private IMyBusinessCardView _view;
private MyBusinessCard _myCard;
public void ViewClickedSave()
{
_myCard.SaveNewBusinessCard(_view);
}
public void LoadView()
{
_myCard.LoadMyBusinessCardToView(_view);
}
}
public class MyBusinessCard
{
public void SaveNewBusinessCard(IMyBusinessCardView view)
{
using (var context = new DataContext())
{
var card = new BusinessCard()
{
Field1 = view.Field1
};
context.BusinessCards.InsertOnSubmit(card);
context.SubmitChanges();
}
}
public void LoadMyBusinessCardToView(IMyBusinessCardView view)
{
// Query using Linq to Sql and set in view
view.Field1 = card.Fields1;
}
}
我在想
视图和控制器非常薄,我想这很好。
“模型”可以访问视图,这不好吗?
我应该引入DTO对象还是应该使用LinqToSql生成的实体
请为设计提供反馈。在codeplex上查看此项目以获得一些灵感 我还建议你读相关的书,这本书读得很好。
在MVP中,大部分工作应该在演示者身上;视图对演示者的了解越少越好。我没有看到任何模型与视图一起工作的地方;我已经看到了演讲者在哪里进行所有的协调。对于单个页面,可以有多个演示者在逻辑上展开 查看本文中的图像,了解两种MVP模式(被动视图和监控控制器): 在本例中,即使视图在Supervision controller中访问模型,它实际上也不会在视图上操作 编辑:刚刚遇到这个框架:作为一个实现
HTH.将视图(或演示者)的知识绑定到模型中肯定不是一个好主意 如果您使用LINQtoSQL对象作为模型类,那么您的视图最终将熟悉数据层 如果上述两种说法是可以接受的,那么这就剩下DTO的答案了 此外,在Presenter上定义事件属性(而不是视图界面)也取得了良好的效果。
通过只附加到相关事件,可以更容易地对特定案例进行单元测试。虽然我认为不将视图和模型链接更有意义,但我们不要忘记MVP设计模式有两种不同的“风格”:所谓的被动视图和所谓的监控控制器。在上阅读这篇文章好吧,在我看来,MVP模式是被动的,更常见的一种
- 视图只包含与UI相关的内容
- 模型根本不知道视图,模型只负责数据访问代码
- Presenter是最重要的一个,保存应用程序的所有业务逻辑
将业务逻辑分离到presenter中的想法是直接对产生最关键bug的代码部分进行单元测试。因此,您的简单代码如下所示
public class MyBusinessCardPresenter { private IMyBusinessCardView _view; private MyBusinessCard _myCard; public void ViewClickedSave() { //You can have all your business logic here which is easy to test var businessCard = new BusinessCard() { Field1 = _view.Field1 }; _myCard.SaveNewBusinessCard(businessCard); } public void LoadView() { _view.Field1 = _myCard.LoadMyBusinessCardToView().Field1; } } public class MyBusinessCard { public void SaveNewBusinessCard(BusinessCard businessCard) { using (var context = new DataContext()) { context.BusinessCards.InsertOnSubmit(businessCard); context.SubmitChanges(); } } public BusinessCard LoadMyBusinessCardToView() { // Query using Linq to Sql and set in view return card; } }