关于三层+工厂模式在实际运用当中的疑问

问题描述

小弟初学三层+工厂模式,发现用起来有许多地方不是很明白.请高手接单1.这个模式下面,数据库的视图如何使用.因为视图没有专门的model对象.难道要为视图建立对象吗.还是不提倡用视图.2.一些页面的gridview显示的内容,可能只要一个表的几个字段,不需要全部.如果用dal去查询,返回的model对象的话.是否数据量就太多了.也浪费了.要如何处理.3.更新数据的问题,比如我只要更新一条数据的一个字段.有没有简便的方法.难道一定要getModel以后,更改一下再update进去呢.因为事实上,更新一条数据的一个字段.我只要知道数据id,和字段的值就好了.希望高手指点以上三个问题.

解决方案

解决方案二:
推荐你使用LINQToSQL。Linq实现了非常轻量的Model和DAL。
解决方案三:
1.应付数据库中的视图,可以用DataSet2.完全可以自由获取你想要的字段数据。针对这个问题,你可以多看看别人的DAL层代码3.voidUpdate(Foodfood)符合面向对象编程,这个传递对象的这种方法对于更新多个字段很受用。当然,你可以用你的方法,三层不是规矩,是解决问题的方法,看情况而变。使用LINQ更新,它就非得要你传递一个对象
解决方案四:
引用楼主vaete的回复:

1.这个模式下面,数据库的视图如何使用.因为视图没有专门的model对象.难道要为视图建立对象吗.还是不提倡用视图.

什么意思?实体对象什么时候成了你的某个软件的附庸概念了呢?实体作为表现层跟业务逻辑层通讯的对象实体,它是从实用出发的。比如我们要设计一个“csdn在一周以来出错情况”的报表,那么这个报表、或者出这个报表的业务逻辑中所需要的实体我们就可以说出来,至于在设计时去纠缠于这些实体是不是有什么关系数据库表的对应物,纯粹是无稽之谈。
解决方案五:
你如何分析和设计面向对象软件的需求和流程?靠关系数据库建表么?
解决方案六:
所谓的“三层、工厂”之类的,是无数实际工作之后的抽象出来的东西,所以它不会去纠结于数据库表、数据库视图的问题,否则就不是抽象了。你只应该问问站在底层实现的时候自己反而不会用数据库视图的问题,看看你使用的所谓实现方式是不是让你丧失了这个能力,比如看看LinqtoSQL是不是就有这个毛病。但是毛病不是出在“三层、工厂”上,是出在底层。
解决方案七:
感谢各位给我的解答,我明白各位的意思了。是我太纠结于model去对应数据库中的表了。不过如果之这样,是否会在开发的时候无形中增加了很多对象。比如说,数据库的产品表,我原先有个对应的model。然后有个产品+销售量的视图。我是否又要创建一个实体model去对应他呢。这样是否会很累呢。我就是感觉这样做的话,多层开发反而不方便
解决方案八:
引用6楼vaete的回复:

感谢各位给我的解答,我明白各位的意思了。是我太纠结于model去对应数据库中的表了。不过如果之这样,是否会在开发的时候无形中增加了很多对象。比如说,数据库的产品表,我原先有个对应的model。然后有个产品+销售量的视图。我是否又要创建一个实体model去对应他呢。这样是否会很累呢。我就是感觉这样做的话,多层开发反而不方便

这个是必然滴,实际上下面我要说的可能就是sp1234大大比较反感的,模型对象分类DO,DTO一类的东西,实际上我也是一个比较关注抽象的人,也觉着的确没啥必要太过区分这些东西,只是实际应用中viewmodel,dto这类东西到却是是真实存在的正好昨天在博客园看了一篇博文《谈谈对于企业级系统架构的理解》http://www.cnblogs.com/liping13599168/archive/2011/05/11/2043127.html虽然也是老生常谈的东西,但是博主本身为你展现了一个渐进的过程。一个从抽象到具象的渐进演变过程只是我们态度是不要刻意去最求那个最终结果,那个结果是根据条件渐进演变滴,没有那个渐进的过程,你想一步就过去话,正好又是另外一个幽默“步子太大了,容易扯着蛋”
解决方案九:
你如果不用视图,你写出来的东西基本都是报废的。你说麻烦?楼上有人说,用3.5的LINQ,你可以试试。那都是用控件直接拖动的。而且代码就几句,类已经方法实现,微软都帮你写好了。但是问题是你看看功能实现以及问题所在吧。底层很重要,楼上说的对:“步子太大了,容易扯着蛋”up↑
解决方案十:
学习。
解决方案十一:
引用9楼lixiaolian7的回复:

学习。

xuexiing
解决方案十二:
Linq实现了非常轻量的Model和DAL。
解决方案十三:
1,可以将视图影射成Model;2,可以仅读取Mode的部分属性,如的用法:Useruser=newUser();OQLq=OQL.From(user).Select(user.ID,userName).END;List<User>result=EntityQuery<User>.QueryList(q);

3,可以仅仅更新Mode的部分属性:Useruser=newUser();user.UID=3;//设置主键的值user.Age=20;EntityQuery<User>.Instance.Update(user.Age);//仅仅更新Age属性

推荐楼主用用我的框架
解决方案十四:
呵呵,楼上的一直在推荐自己的框架,不知你的框架是否商用了,有无bug
解决方案十五:
引用13楼zhuawang的回复:

呵呵,楼上的一直在推荐自己的框架,不知你的框架是否商用了,有无bug

详细情况,请看官网说明:http://www.pwmis.com/sqlmap框架是来自多个项目的经验总结,并且受到了众多网友的肯定,已经有不少朋友获取了源码,官网有说明。由于来自实际商业项目应用,可以肯定发布的版本没有Bug。
解决方案:
当初我也有楼主的困惑,也被领导盲目的要求累得半死,所以我一气之下自己做了一个框架,并宣传给其他朋友,让大家都能够轻松开放,彻底摆脱数据开发的问题,只需关注与业务逻辑与界面的开发。
解决方案:
我们公司也有一个你类似的框架,而且也有一套工具可以快速的生成各个层代码,只要稍作修改就可以操作数据了。当时公司的框架返回的是DataTable,不是List<User>和User这样的对象集合和对象。我还是有和楼主一样的疑问,如果是返回对象的话,是否要为所有的视图生成一个实体?
解决方案:
回zhuawang:是否将视图生成实体看业务需要,不要将实体类和数据库表、视图等同,实体可以映射到一个表或者多个表,复杂的查询,视图,存储过程等,可以简单的认为,实体就是系统中要使用的数据载体,这些数据可以从数据库来,也可以从XML文件或者其它地方来,也就是,不要DB=>Entity而是Entity=》DB否则你会纠结于数据库的设计,而无法体会到OOAD的优势。
解决方案:
引用17楼bluedoctor的回复:

回zhuawang:是否将视图生成实体看业务需要,不要将实体类和数据库表、视图等同,实体可以映射到一个表或者多个表,复杂的查询,视图,存储过程等,可以简单的认为,实体就是系统中要使用的数据载体,这些数据可以从数据库来,也可以从XML文件或者其它地方来,也就是,不要DB=>Entity而是Entity=》DB否则你会纠结于数据库的设计,而无法体会到OOAD的优势。

谢谢你的解答,我明白你的意思。我也够懂的就是如何设计这个实体吧。我们公司的ORM只是简单的对每个表生成实体类。好像Nhibernate也是吧。不知道你的框架是怎么生成实体的。如果是用工具生成的话不也是只能从数据库表来对应生成吗?
解决方案:
目前大多数ORM工具都是从数据库生成实体的,如果先有实体类,再映射到数据库,工具支持比较困难,这也是“CodeFirst”的不足之处,不过现在最新的EntityFramework已经可以支持CodeFirst了。PDF.NET数据开发框架的实体类工具目前还只能提供从数据库生成实体的方式,支持将表、视图甚至复杂的SQL查询语句映射成实体;当然可以先有实体类,不过需要你手工去做映射关系(EF将这个过程自动化了)。
解决方案:
引用19楼bluedoctor的回复:

目前大多数ORM工具都是从数据库生成实体的,如果先有实体类,再映射到数据库,工具支持比较困难,这也是“CodeFirst”的不足之处,不过现在最新的EntityFramework已经可以支持CodeFirst了。PDF.NET数据开发框架的实体类工具目前还只能提供从数据库生成实体的方式,支持将表、视图甚至复杂的SQL查询语句映射成实体;当然可以先有实体类,不过需要你手工去做映射关系(……

能发一份你的框架的源码给我吗?我的邮箱:zhuaone@foxmail.com

时间: 2024-10-03 01:50:49

关于三层+工厂模式在实际运用当中的疑问的相关文章

设计模式之简单工厂模式(Simple Factory Pattern)

设计 工厂模式 THE FACTORY PATTERN 在面向对象(OO)程序中,我们经常看到的一种模式就是简单工厂模式(Simple Factory Pattern).简单工厂模式根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个共同的父类和共同的方法,但每个方法执行的认为不同,而且根据不同的数据进行了优化.简单工厂模式实际上不属于23个GOF模式,但它可以作为工厂方法模式(FACTORY Method)的一个引导. 工厂模式如何工作 为了便于理解简单工厂模式,可以看下

.NET抽象工厂模式微理解:教你在项目中实现抽象工厂

最近在学习MVC,对于MVC里面的一些项目上的东西都和抽象模式有关,今天就微说明一下个人对于抽象工厂模式的理解,以方便学习MVC及工厂模式相关的同事和博友们理解.不足之处,还请斧正! 首先简单阐述一些三层的关系,相信观看该文章的博友们对于三层设计早已经是烂熟于心了,我这边就简单说明一下: 用户界面表示层(Web) 业务逻辑层(BLL) 数据访问层(DAL) 1:数据数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库

工厂模式(转)

  今天跟大家分享一下我对工厂系列模式的理解,主要包括简单工厂.工厂方法.抽象工厂模式. 场景一: 话说苹果和小米是两大手机巨头,他们各自推出的经典手机是IPhone手机系列和小米手机系列. 两家公司在手机的整个开发过程当中,都只负责产品的研发和设计工作,而手机制造则委托给手机工厂. 设计模式中有一个叫面向抽象编程的原则,在程序中体现为使用接口或者抽象类.下面我们将苹果和小米手机的共同特征和 行为来做一个抽象,这里我们使用抽象类,如下: 由于手机都有名字.型号.价格等等一些特征,所以我们可以将这

设计模式之四(抽象工厂模式第三回合)

原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如IFactory factory=new AccessFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置.我们的设计不能去防止需要的变更,那么我们的理想便是让改动变得最小,那么现在如果你要更改数据库访问,

C#简单工厂模式——初遇GoF设计模式

---无聊的分割线--- 在面向对象程序中,我们经常看到一种模式就是简单工厂模式(Simple Factory Pattern).也许你也没意识到原来你一直在使用简单工厂模式,没关系,很多时候我们往往只需要使用就可以了. 简单工厂模式根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个共同的父类和共同的方法,但每个方法执行的任务不同,而且根据不同的数据进行了优化.简单工厂模式实际上不属于23个GoF模式,但它可以作为学习工厂方法模式的一个引导.   1.先定义一个父类 2.

php中设计模式工厂模式和单例模式实例

1.工厂模式 工厂模式 是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动更改. 主要作用是降低耦合度.    代码如下 复制代码 abstract class Operation{     abstract public  function getValue($num1,$num2);     public  function getAttr(){         retu

第2章 简单工厂模式(Sample Factory)

原文 第2章 简单工厂模式(Sample Factory) 一般用到的场景:对象多次被实例引用,切有可能会发生变化   拿我们的简单三层举例子 先定义dal层 1 2 3 4 5 6 7 8     class Dal     {         public void Delete()         {           //...          }              } 工厂类 1 2 3 4 5 6 7 8 9 10     class Factory     {     

《设计模式》学习笔记3——工厂模式

定义 工厂模式实际上有广义和狭义的分别,广义的工厂模式指的是简单工厂模式.工厂方法模式.抽象工厂模式三个,而狭义的工厂模式就是这里的工厂方法模式,一般情况下如果有人直接说工厂模式,多半指的就是工厂方法模式.工厂方法模式引用书中的定义如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个 类实例化.工厂方法模式让一个类的实例化延迟到其子类.工厂方法模式又简称为工厂模式 (Factory Pattern),又可称作虚拟构造器模式(Virt

《设计模式》学习笔记2——简单工厂模式

定义 简单工厂模式并不属于GoF(Gang of Four四人组)23中设计模式,有些地方的解释说因为简单工厂模式太简单,所以23中设计模式就没有单独列出. 但是简单工厂模式在实际的应用中却很常用,因此在刘伟老师的<设计模式>一书中就还是列了出来. 简单工厂模式引用书中的定义如下: 简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类.因为在简单工厂模式中用于创建实例的方法是静态(static)方法