返回顶部
首页 > 资讯 > 精选 >.NET程序员应该熟悉的开发模式是什么
  • 119
分享到

.NET程序员应该熟悉的开发模式是什么

2023-06-17 13:06:16 119人浏览 薄情痞子
摘要

这篇文章给大家介绍.net程序员应该熟悉的开发模式是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我们总会有这样一个经验:一个系统最不容易也最不应该变化的部分是领域逻辑,最容易变化也最应该变化的是数据的呈现方式。在

这篇文章给大家介绍.net程序员应该熟悉的开发模式是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

我们总会有这样一个经验:一个系统最不容易也最不应该变化的部分是领域逻辑,最容易变化也最应该变化的是数据的呈现方式。

在Java的各种应用中可以说是到处可见mvc,J2EE贯穿MVC的概念,Android的开发方式也是类MVC的,MVC结构对于做过Java应用的人而言简直就是司空见惯。而在.NET这边,由于之前微软为大家提供的各种winformasp.net项目典范(比如那个petshop series)将“三层”概念很好的灌输到了.NET程序员的大脑中,许多.NET开发者凡是做个东西都要搬出自己最拿手的IModel、IDAL这样的神器。

其实MVC与所谓的“三层架构”是两个层次上的东西,前者是一种结构模式,而后者则是分层的角度去说。

一件很奇怪的事情,许多人知道“三层”却不知道MVC,其实这要归结与.NET的早期开发技术ASP.NET和winfORM这些page controller的典范让许多人对三层夸夸其谈却对MVC视而不见甚至一无所知。什么是page controller模式呢?搞.NET的大多都用过winform和WEBform,这种xxxform用起来很直观,我们想要做一个程序,ok,最简单的方式就是拖拖拽拽几个控件,然后在一个叫code behind的东西里写这些UI事件的处理逻辑,加一大堆变量用于记录数据和状态,这样一个程序就能出炉。这种开发方式对于一些小软件系统的开发其实效率还是蛮高的,后来人们看到其弊端---一旦修改UI,事件处理就要跟着变,但是业务还是那个业务,凭什么要修改非UI的代码?于是有人提出“三层”,最朴素的理解就是将原本那堆事件处理里的code分成业务代码和数据库访问代码并转移到其它类中,做多了就把那坨UI叫做UI,那坨业务代码叫做BLL,那坨DAO叫做DAL。也就是这种架构:

.NET程序员应该熟悉的开发模式是什么

而对于J2EE的开发者来说熟悉的是下图。

.NET程序员应该熟悉的开发模式是什么

(说明:这两幅图copy自是daxnet文)

MVC是什么

MVC是一个很经典的结构,并且其又其思想衍生出很多变种比如MVP,MVVP。传统的MVC结构之一是这样的(拿主动型MVC来说):

.NET程序员应该熟悉的开发模式是什么

比如web开发(比如ASP.NET MVC或者是Java的web开发方式),view就是纯web页面或者webservice,当提交一个表单/调用webservice或者ajax后会将数据提交给controller(当然期间可能会经过各种filterchain、listener这样的东西)controller调用相应的业务模块来处理这个请求,最终结果会更新View的显示。

MVP

对于非天然MVC的框架

对于ASP.NET/winform而言,虽然可以通过改造让其支持MVC结构的开发(比如通过定制IHttpModule、IHttpHandler云云),但是在企业看来这些都算是邪门武功(因为这样会丧失xxxform在开发上的很多特性比如快速开发)。大多数使用的是mvp模式。什么是mvp呢?其实mvp是MVC的一个变种。因为用winform或者webform的话form始终是个阻碍MVC开发的问题。那么好,我们仍然使用designer和codebehind,其实一个架构设计的好坏是取决于人而不是具体的技术的,只要我们OO一时强page controller一样好用。

.NET程序员应该熟悉的开发模式是什么

在MVP模式中我们需要自己定制各个View(web页面或者窗体)对应的IView和IPresenter、IModel。IView要对IPresenter暴露操作UI、数据绑定的接口,IPresenter对IView要暴露当UI事件触发需要调用的接口,IPresenter根据IView传递过来的请求调用业务接口并根据结果操作UI。举个简单的例子,一个计算“x+y=?”的程序。如果我们这样定义IPresenter和IView

public interface IPresenter       {           IView View { get; set; }           void CalculateResult();       }   public interface IView       {           IPresenter Presenter { get; set; }           void ShowResult(string result);           int ValueOne { get; }           int ValueTwo { get; }       }

IPresenter的实现如下(这里从简把IModel去掉了)

Presenter

namespace ClientLibrary  {      public class Presenter : IPresenter      {          private IView _view;          public IView View          {              get             {                  return _view;              }              set             {                  _view = value;                  _view.Presenter = this;              }          }           private static readonly string RESULT_FORMATTER = "{0}+{1},the result is {2}";          public void CalculateResult()          {              if (_view != null)              {  var result = string.Format(RESULT_FORMATTER, _view.ValueOne, _view.ValueTwo, _view.ValueOne + _view.ValueTwo);                  _view.ShowResult(result);                  this.A = 123;              }          }          private int _a;          public int A          {              set             {                  A = value;              }          }      }  }

View的实现如下(那silverlight为例,换成别的也行)

MainPage

namespace debug  {      public partial class MainPage : UserControl, IView      {          public MainPage()          {              InitializeComponent();          }           private IPresenter _presenter;   private void btn_Click(object sender, RoutedEventArgs e)          {              if (_presenter != null)              {                  _presenter.CalculateResult();              }              #region hidden                           #endregion           }           public IPresenter Presenter          {              get             {                  return _presenter;              }              set             {                  _presenter = value;              }          }           public void ShowResult(string result)          {              MessageBox.Show(result);          }           public int ValueOne          {              get { return int.Parse(tb1.Text); }          }           public int ValueTwo          {              get { return int.Parse(tb2.Text); }          }      }  }

一个很简单的东西,看上去写成的要多些那么一坨东西,但是好处是显而易见的,就是更换view非常方便,根本不用去改你的IPresenter、Presenter和业务。一切都是接口调用而不依赖具体实现,这就是好处。

你必须要懂的MVVM

对于.NET平台的开发人员,托微软的福分我们拥有一种更为强大的模型---MVVM。这应该算是做WPF/Silverlight应用的人必懂的一种结构,WPF/silverlight天生支持数据绑定和命令绑定(不过sl在命令绑定上还比较弱),这就为我们使用MVVM创造了可能。

.NET程序员应该熟悉的开发模式是什么

View是什么呢,纯的View只有xaml或者附带必要的只与View本身相关逻辑代码。ViewModel,你可以把它理解为View具体呈现内容所依赖数据的一个抽象,在MVVM中View与ViewModel总会有一种绑定关系,一旦ViewModel中被绑定的数据发生改变View上的数据就会跟着变,相反也有可能,比如你的账号密码框内容发生变化,关联的ViewModel中的数据就会被框架自动通知到。

在wpf/silverlight中,绑定是通过xaml语法来完成(虽然你可以选择用C#来写但不符合mvvm的宗旨),并且绑定双方的通知机制是有框架来完成,也就是说一个会xaml和blend的美工只需事先和coder商量下“咱们的xx和xx是在哪个ViewModel上叫XXX的属性的XXX属性……”问题之后就可以各干各的了。那么ViewModel怎么写,咋view中又怎么绑定到viewmodel呢?首先我们谈ViewModel。

说道ViewModel你需要知道依赖属性和依赖对象的概念,这是wpf/silverlight的基础所以不多说。有两种方式写ViewModel。***种是自己去实现INotifyPropertyChanged接口,并在属性变化时去调用NotifyPropertyChanged事件。

为了方便我们定义一个ViewModelBase的抽象基类,然后让其他ViewModel继承这个基类。

ViewModelBase

public abstract class ViewModelBase : System.ComponentModel.INotifyPropertyChanged, IDisposable       {           public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;           protected void OnPropertyChanged(string propertyName)           {               if (PropertyChanged != null)               {         var arg = new System.ComponentModel.PropertyChangedEventArgs(propertyName);                   PropertyChanged(this, arg);               }           }           public virtual void Dispose()           {                        }       }
DemoViewModel public class DemoViewModel : ViewModelBase      {          #region fields          private string _propertyA;          #endregion          #region presentation properties          public string PropertyA          {              get              {                  return _propertyA;              }              set              {                  if (_propertyA != value)                {                      _propertyA = value;                   base.OnPropertyChanged("PropertyA");                  }              }        }          #endregion    }

第二种是利用DependencyObject和DependencyProperty。

PeopleItemViewModel

public class PeopleItemViewModel : DependencyObject, IPeopleItemViewModel      {          public PeopleItemViewModel()          {                        }  public static readonly DependencyProperty SimpleUserDataProperty = DependencyProperty.ReGISter("SimpleUserData", typeof(SimpleUserData), typeof(PeopleItemViewModel));  public static readonly DependencyProperty RelativeSimpleUserDataProperty = DependencyProperty.Register("RelativeSimpleUserData", typeof(ObservableCollection<SimpleUserData>), typeof(PeopleItemViewModel));  public static readonly DependencyProperty AllSimpleUserDataProperty = DependencyProperty.Register("AllSimpleUserData", typeof(ObservableCollection<SimpleUserData>), typeof(PeopleItemViewModel));           public SimpleUserData SimpleUserData          {              get             {                  return (SimpleUserData)base.GetValue(SimpleUserDataProperty);              }              set             {                  if (!base.CheckAccess())                  {                      Dispatcher.Invoke(new Action(                          () =>                          {                              SimpleUserData = value;                          }));                  }                  else                     base.SetValue(SimpleUserDataProperty, value);              }          }          public ObservableCollection<SimpleUserData> RelativeSimpleUserData          {              get             {  return (ObservableCollection<SimpleUserData>)base.GetValue(RelativeSimpleUserDataProperty);              }              set             {                  if (!base.CheckAccess())                  {                      Dispatcher.Invoke(new Action(                          () =>                          {                              RelativeSimpleUserData = value;                          }));                  }                  else                 {  base.SetValue(RelativeSimpleUserDataProperty, value);  var collectionView = CollectionViewSource.GetDefaultView(value);  collectionView.SortDescriptions.Add(new SortDescription("Distance", ListSortDirection.Ascending));                  }              }          }          public ObservableCollection<SimpleUserData> AllSimpleUserData          {              get             {        return (ObservableCollection<SimpleUserData>)base.GetValue(AllSimpleUserDataProperty);              }              set             {                  if (!base.CheckAccess())                  {                      Dispatcher.Invoke(new Action(                          () =>                          {                              AllSimpleUserData = value;                          }));                  }                  else                 {  base.SetValue(AllSimpleUserDataProperty, value);  var collectionView = CollectionViewSource.GetDefaultView(value);  collectionView.SortDescriptions.Add(new SortDescription("Distance", ListSortDirection.Ascending));                  }              }          }  }

在View中绑定ViewModel。

为了方便,我们可以在app.xaml中将需要的viewmode放到全局资源字典中。

.NET程序员应该熟悉的开发模式是什么

然后再我们的vs视图设计器Properties(中文版显示的是“属性”)页上选择为绑定源设置绑定目标(包括source和path等)以及必要的值转换器等等即可。

.NET程序员应该熟悉的开发模式是什么 .NET程序员应该熟悉的开发模式是什么 .NET程序员应该熟悉的开发模式是什么

虽然vs很强大,但个人还是建议熟悉xaml的绑定语法,想当初用vs2008搞wpf的时候貌似还没有这么方便的设计器。

关于.NET程序员应该熟悉的开发模式是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: .NET程序员应该熟悉的开发模式是什么

本文链接: https://lsjlt.com/news/289501.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • .NET程序员应该熟悉的开发模式是什么
    这篇文章给大家介绍.NET程序员应该熟悉的开发模式是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我们总会有这样一个经验:一个系统最不容易也最不应该变化的部分是领域逻辑,最容易变化也最应该变化的是数据的呈现方式。在...
    99+
    2023-06-17
  • 为什么Python开发人员应该熟悉LeetCode和NumPy?
    Python是一种广泛使用的编程语言,特别是在数据科学和机器学习领域。但是,如果你是一名Python开发人员,你是否知道你应该熟悉LeetCode和NumPy?这篇文章将会为你解答这个问题。 LeetCode是一个在线编程平台,提供了大量的...
    99+
    2023-08-10
    leetcode 开发技术 numy
  • 为什么Java开发者应该熟悉Linux和Unix的基础知识?
    Java是一门广泛使用的编程语言,它拥有着丰富的类库和框架,可以用于开发各种类型的应用程序。然而,除了Java本身的知识之外,Java开发者还应该熟悉Linux和Unix的基础知识。为什么呢?本文将探讨这个问题,并给出一些相关的演示代码。 ...
    99+
    2023-11-14
    linux unix laravel
  • web前端、php程序员和.net程序员的区别是什么
    本篇内容介绍了“web前端、php程序员和.net程序员的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Web前端Web前端是...
    99+
    2023-07-05
  • .NET老程序员推荐的7个开发类工具分别是什么
    小编今天带大家了解.NET老程序员推荐的7个开发类工具分别是什么,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“.NET老程序员推荐的...
    99+
    2023-06-17
  • PHP程序员应该具有什么样的技能
    这篇文章主要介绍PHP程序员应该具有什么样的技能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL能力在开发上的应用基于几个能力体现:(1)了解:知道用PHP连接数据库;懂得写一些简单的SQL;建一些简单的索引...
    99+
    2023-06-17
  • web程序员应该避免的五种代码注释是什么
    本篇内容主要讲解“web程序员应该避免的五种代码注释是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web程序员应该避免的五种代码注释是什么”吧!1.自以为很了不得的程序员public&nb...
    99+
    2023-06-17
  • Linux应用程序开发过程是什么
    Linux应用程序开发过程通常包括以下步骤:1. 确定需求:明确应用程序的功能和目标,并确定用户需求。2. 设计架构:确定应用程序的...
    99+
    2023-09-01
    Linux
  • Java程序员应该知道的10个调试技巧分别是什么
    本篇文章给大家分享的是有关Java程序员应该知道的10个调试技巧分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。作者将使用大家常用的的开发工具Eclipse来调试Jav...
    99+
    2023-06-17
  • 为什么PHP、Git和IDE是每个开发人员都应该掌握的技能?
    随着计算机技术的不断发展,软件开发行业也变得越来越重要。作为一名开发者,掌握一些基本的技能是必不可少的。本文将介绍PHP、Git和IDE这三个技能,并解释为什么每个开发人员都应该掌握它们。 一、PHP PHP是一种广泛使用的开源服务器端脚本...
    99+
    2023-09-11
    git ide 关键字
  • 为什么Java开发人员应该考虑使用容器?NPM如何简化开发流程?
    随着互联网的快速发展,软件开发也越来越迅猛。Java作为一种广泛使用的编程语言,开发人员们需要不断地适应新的技术和工具。其中,容器和NPM是两个非常流行的工具,它们可以极大地简化Java开发的流程,提高开发人员的效率和代码的质量。 一、为...
    99+
    2023-10-02
    ide npm 容器
  • Python开发者应该知道的7个开发库分别是什么
    Python开发者应该知道的7个开发库分别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。请注意我特别排除了像SQLAlchemy和Flask这样的库,因为其实在太优秀了,...
    99+
    2023-06-17
  • 怎么判断.NET Core应用程序是以管理员身份运行的
    这篇文章主要介绍了怎么判断.NET Core应用程序是以管理员身份运行的的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么判断.NET Core应用程序是以管理员身份运行的文章都会有所收获,...
    99+
    2023-06-29
  • 舞蹈教学开发小程序有什么特色模式
    这篇文章将为大家详细讲解有关舞蹈教学开发小程序有什么特色模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。舞蹈教学小程序的出现为许多舞蹈学习者和爱好者提供了在线学习渠道。用户可以一站完成教学、学习、展示、...
    99+
    2023-06-27
  • 云服务器ecs是什么服务模式的应用程序
    1. 什么是云服务器 ECS? 云服务器 ECS(Elastic Compute Service)是一种基于云计算的服务模式,它提供了可弹性伸缩的虚拟服务器实例,用于托管应用程序、网站和服务。ECS 提供了计算资源、存储和网络功能,使用户...
    99+
    2023-10-28
    应用程序 模式 服务器
  • 小程序的开发语言是什么
    网站流量统计工具是一种用于分析和监测网站访问情况的工具。通过这些工具,网站管理员可以了解网站的访问量、访客来源、浏览页面、停留时间等...
    99+
    2024-04-17
    小程序
  • Knockout应用开发的模板绑定是什么
    本篇内容主要讲解“Knockout应用开发的模板绑定是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Knockout应用开发的模板绑定是什么”吧!目的tem...
    99+
    2024-04-02
  • 设计模式在云原生应用程序开发中的价值
    设计模式在云原生应用程序开发中至关重要,提供以下优势:可重用性:实现代码模块化,提高可重用性。例如,factory 模式用于创建通用对象生成机制。可读性:遵循命名惯例,提高代码可读性和可...
    99+
    2024-05-11
    云原生 设计模式 python 代码可读性
  • Java在移动应用程序开发中的作用是什么
    本篇内容介绍了“Java在移动应用程序开发中的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!当您决定构建一个新的移动应用程序时,选...
    99+
    2023-06-15
  • Python for S60手机开发应用程序的方法是什么
    本篇内容介绍了“Python for S60手机开发应用程序的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、开发环境介绍及安装...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作