问一个MODEL的问题,关于三层结构的MODEL问题,知道的,进来讨论一下。。有理就给分了。。。。。。。。。。。。。。。。进来讨论吧。

xghabc 2014-06-30 10:27:25
三层结构中,WEB BLL DAL 先说基础模式。其它的先不用讨论。

关于,
WEB MODEL
BLL MODEL
DAL MODEL

这三个MODEL如何命名,管理,相互转化?

分别在单表的情况,多表查询的情况两个情况进行讨论。。。

高手说吧。。
...全文
1339 53 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2014-07-03
  • 打赏
  • 举报
回复
引用 48 楼 wanghui0380 的回复:
对于你这种论调,我只能以呵呵+呵呵 应对了。请记住你的DAL最早的名字叫什么----“数据持久层”,不是什么“OO模型层”,还面对对象???除非你是nosql,否则关系数据库天生就不是对象型滴,你这算脑补么??
dbmodel与DAL不是同一层次的东西,好吗?谁人规定dbmodel不能OO?谁人规定只有nosql才能OO?井底之蛙...
wanghui0380 2014-07-03
  • 打赏
  • 举报
回复
至于其他的俺们也不想说啥了fastCSharp 呵呵+呵呵,应该是和那个PDFXXX一样著名了
wanghui0380 2014-07-03
  • 打赏
  • 举报
回复
引用 45 楼 sbwwkmyd 的回复:
有人说DAL如何实现不重要,我只能说呵呵。因为从最基本的数据开始你就已经与面向对象背道而驰了,后面当然需要各种补坑了。当然有些人习惯了补坑,也就真的不重要了。
对于你这种论调,我只能以呵呵+呵呵 应对了。请记住你的DAL最早的名字叫什么----“数据持久层”,不是什么“OO模型层”,还面对对象???除非你是nosql,否则关系数据库天生就不是对象型滴,你这算脑补么??
moonwrite 2014-07-03
  • 打赏
  • 举报
回复
分别在单表的情况,多表查询的情况两个情况进行讨论。。。 多表情况1. 现在的ORM都有导航属性了 2.再定义一个实体
moonwrite 2014-07-03
  • 打赏
  • 举报
回复
BLL和DAL公用一个Model Web可能需要自己的ViewModel 怎么转换方便~可以使用一些组件 http://www.cnblogs.com/xishuai/p/3708483.html 当然如果字段和数据库的一致~那么用CodeSmith或T4模版生成
showjim 2014-07-03
  • 打赏
  • 举报
回复
如果基本业务逻辑层的表格继承自同一dbmodel并且有相同的业务逻辑,还是上面那个列子,那么可以这样定义
    public abstract class forumAverage<valueType> : publishData.dataModel.forumAverage.sqlTable<valueType>
        where valueType : forumAverage<valueType>
    {
    //这里是公共业务逻辑处理
    }
    /// <summary>
    /// 使用《中国标准书号》各类图书的平均印数、平均印张和平均定价[全 国] 
    /// </summary>
    public class average : forumAverage<average>
    {
    }
    /// <summary>
    /// 使用《中国标准书号》各类图书的平均印数、平均印张和平均定价[中央]
    /// </summary>
    public class centralAverage : forumAverage<centralAverage>
    {
    }
    /// <summary>
    /// 使用《中国标准书号》各类图书的平均印数、平均印张和平均定价[地方]
    /// </summary>
    public class localAverage : forumAverage<localAverage>
    {
    }
    /// <summary>
    /// 各类课本的平均印数、平均印张和平均定价
    /// </summary>
    public class average : forumAverage<average>
    {
    }
有人说DAL如何实现不重要,我只能说呵呵。因为从最基本的数据开始你就已经与面向对象背道而驰了,后面当然需要各种补坑了。当然有些人习惯了补坑,也就真的不重要了。
showjim 2014-07-03
  • 打赏
  • 举报
回复
说到dbmodel(有些人认为不是model),并不是一个字段/属性对应一个列,这些model也不对应实际的表格(而仅仅是一个抽象模型)。下面的代码无关某些人说的业务model,仅仅描述存储结构定义层。比如
    /// <summary>
    /// 平均印数、平均印张和平均定价
    /// </summary>
    public abstract class average : year
    {
        /// <summary>
        /// 每种印数(万册)
        /// </summary>
        public column.average3 Printing;
        /// <summary>
        /// 每册印张(印张)
        /// </summary>
        public column.average3 Sheet;
        /// <summary>
        /// 每册定价(元)
        /// </summary>x
        public column.average3 Price;
        /// <summary>
        /// 每印张定价(元)
        /// </summary>
        public column.average3 SheetPrice;
    }
    /// <summary>
    /// 各类图书的平均印数、平均印张和平均定价
    /// </summary>
    [sqlTable(Connection = sqlTable.connection.PublishData, CacheType = typeof(fastCSharp.sql.cache.whole.identityArray<,>))]
    public partial class forumAverage : average
    {
        /// <summary>
        /// 版块
        /// </summary>
        [fastCSharp.setup.dataMember(MaxLength = 128)]
        public string Forum;
    }
    /// <summary>
    /// 各地区使用《中国标准书号》各类图书的平均印数、平均印张和平均定价[使用《标准书号》部分合计] 
    /// </summary>
    [sqlTable(Connection = sqlTable.connection.PublishData, CacheType = typeof(fastCSharp.sql.cache.whole.identityArray<,>))]
    public partial class areaAverage : dataModel.average
    {
        /// <summary>
        /// 版块
        /// </summary>
        [fastCSharp.setup.dataMember(MaxLength = 128)]
        public string Forum;
        /// <summary>
        /// 区域
        /// </summary>
        [fastCSharp.setup.dataMember(MaxLength = 32)]
        public string Area;
    }
    /// <summary>
    /// 新出+重印+租型 平均数
    /// </summary>
    [fastCSharp.setup.cSharp.sqlColumn]
    public partial struct average3
    {
        /// <summary>
        /// 新出
        /// </summary>
        public dataMember.average New;
        /// <summary>
        /// 重印
        /// </summary>
        public dataMember.average Reprint;
        /// <summary>
        /// 租型
        /// </summary>
        public dataMember.average ForRent;
    }
    /// <summary>
    /// 平均值
    /// </summary>
    [fastCSharp.setup.dataMember(DataType = typeof(int?))]
    public partial struct average
    {
        /// <summary>
        /// 整数值
        /// </summary>
        [fastCSharp.setup.cSharp.json(IsIgnoreCurrent = true)]
        private uint? value100;
        /// <summary>
        /// 是否为空值
        /// </summary>
        public bool IsNull
        {
            get { return value100 == null; }
        }
        /// <summary>
        /// 两位小数
        /// </summary>
        public double Value
        {
            get { return (uint)value100 / 100.0; }
        }
        /// <summary>
        /// 还原数值
        /// </summary>
        /// <param name="number">除数</param>
        /// <returns></returns>
        public double Div(double number)
        {
            return (uint)value100 / number;
        }
        public static implicit operator average(int? value) { return new average { value100 = value != null ? (uint?)(int)value : null }; }
        public static implicit operator int?(average value) { return value.value100 != null ? (int?)(uint)value.value100 : null; }
    }
可以看到,code frist方式的 存储结构定义层,不需要关心数据库,可以使用 继承/组合 等所有C#支持的面向对象技术来构建。 然后是基于表格的基本业务逻辑层,绑定表格的实现就是在这里,这里是一个model对于一张表并且继承自dbmodel,一个dbmodel可以对应多张表格。如果存在外围组件,可以在这里为业务组件模型供接口实现。比如
    /// <summary>
    /// 使用《中国标准书号》各类图书的平均印数、平均印张和平均定价[全 国] 
    /// </summary>
    public class average : publishData.dataModel.forumAverage.sqlTable<average>
    {
    }
    /// <summary>
    /// 使用《中国标准书号》各类图书的平均印数、平均印张和平均定价[中央]
    /// </summary>
    public class centralAverage : publishData.dataModel.forumAverage.sqlTable<centralAverage>
    {
    }
    /// <summary>
    /// 使用《中国标准书号》各类图书的平均印数、平均印张和平均定价[地方]
    /// </summary>
    public class localAverage : publishData.dataModel.forumAverage.sqlTable<localAverage>
    {
    }
    /// <summary>
    /// 各类课本的平均印数、平均印张和平均定价
    /// </summary>
    public class average : publishData.dataModel.forumAverage.sqlTable<average>
    {
    }
如果没有基本业务逻辑,都是一些空壳,用于绑定表格名称。 那么XXX.sqlTable<T>是什么呢?它就是代码生成的DAL,继承自dbmodel
            public class sqlTable<valueType> : publishData.dataModel.forumAverage, fastCSharp.setup.cSharp.sqlTable.ISql<valueType, publishData.dataModel.forumAverage.memberMap>
zhaofeiye 2014-07-03
  • 打赏
  • 举报
回复
混点分
showjim 2014-07-03
  • 打赏
  • 举报
回复
引用 51 楼 wanghui0380 的回复:
我其实不知道谁是这东西,不过我知道20人以下的小作坊是你这么搞滴,而真正第项目DAL可不是听你的安排,DAL听DBA和架构师的安排,DBA让你一个实体几张表就几张表,几个实体一张表就一张表,架构师让你把数据存xml就存xml里,让你去远程分布缓存里取你就得去远程分布缓存里取,人家可不根据你这个DAL去安排工作
瞎鸡巴扯淡你就。 小作坊与小作坊模式是两回事,一堆垃圾凑在一起还是垃圾,不要以为呆在大堆里面就有了莫名的优越感。 请问dbmodel与一个实体几张表有什么关系?请问dbmodel与数据存在哪里有什么关系?请问dbmodel与分布缓存有什么关系?DAL的选择与DBA有什么关系?架构师难道是瞎指挥?
wanghui0380 2014-07-03
  • 打赏
  • 举报
回复
引用 50 楼 sbwwkmyd 的回复:
谁人规定只有nosql才能OO?井底之蛙... .
我其实不知道谁是这东西,不过我知道20人以下的小作坊是你这么搞滴,而真正第项目DAL可不是听你的安排,DAL听DBA和架构师的安排,DBA让你一个实体几张表就几张表,几个实体一张表就一张表,架构师让你把数据存xml就存xml里,让你去远程分布缓存里取你就得去远程分布缓存里取,人家可不根据你这个DAL去安排工作
showjim 2014-07-03
  • 打赏
  • 举报
回复
我提到的web视图,就是整个网站/应用的 需求数据关系图,这个基本数据图是基于class的,是真实数据的载体。 而外围组件的数据需求(比如存储组件模型、业务组件模型...),应该基于接口或者委托,是需求数据的扩展。
xghabc 2014-07-02
  • 打赏
  • 举报
回复
顶上去。。。。
wanghui0380 2014-07-02
  • 打赏
  • 举报
回复
至于UI层面上,我说UI是最难把控和掌握滴,尤其是定制软件,天知道你的客户一拍脑袋会把什么跟什么连接在一起显示 所以这边和逻辑上的model不同也可以想象的出来,所以这里也有转换,这里这个model叫什么其实无所谓,现在有人叫viewmodel,你要这么叫随便你,不过就是个名字而已,但是不管怎么叫他只是逻辑上的model的重新组合和重载,所以我们也并不太在意这块,只要你中间的逻辑model提供完备,UI这块只要符合逻辑都可以随便你去搞(当然要求上违反逻辑滴,这个不是你做错了,就是客户想错了,这个基本没办法,你做错了当然错了,客户错了只能沟通,沟通不了,只能算需求就错了,怨不了实现人员了)
wanghui0380 2014-07-02
  • 打赏
  • 举报
回复
顺带延伸一下,我们反对一表一实体的原因很简单,因为表结构那是DBA考虑的 而对于逻辑上,一表也许有多个实体,一实体也许有多个表,老p其实也在一些场合表明过他对EF略微有些失望“因为没办法表明继承和多态”,这是老p的说法,这个说法实际上意思就是逻辑上model和dbmodel其实根本就不一样的东西,博客园把这两个混同一起,在项目上自然就产生你的疑问,不一样自然需要转换。但是如果你换过来想,如果你本身就不依赖dbmodel,你本身只依赖逻辑model,那么你就没啥疑问了,nosql当然可以自然表达,但是换到sql不适配,不适配那就不适配呗,下面自己转换去,反正上层根本不依赖他,上层只依赖逻辑上的model而非dbmodel
wangerpang 2014-07-02
  • 打赏
  • 举报
回复
1。分不分层看你的应用。 2。你可以自己直接实现你的功能,随着需求的变动或者修改,你就会发现你原来的设计要不停的修改,这时你就会知道如何分层,才能让自己的修改代价最小。
  • 打赏
  • 举报
回复
说到“管理,相互转化?”,这个也确实值得说一下。但是如果知道另外的Model都不是“三层”的Model,显然更会让你集中精力去研究框架。 比如说你研究某一种表现层框架是会花一半经历去研究数据Model,它要求你这样的创建Model;另外一种表现层框架,它建议你用另外一种。 你研究某种DAL层框架也会花一半精力去研究数据建模,你会发现EF是这样建模的,而MongoDb是那样为数据建模的,总之都不一样。 知道了区别,也就知道转化。因为表现层的Model对数据层是完全屏蔽的,DAL层的数据模型对表现层也是完全屏蔽的。在通讯方面,只有三层结构里的Model出现。
wanghui0380 2014-07-02
  • 打赏
  • 举报
回复
另外在对lz"分别在单表的情况,多表查询的情况两个情况进行讨论。。"滴讨论一下 俺们csdn滴不同于博客园的人,俺工作在第一线,对博客园那种形式大于逻辑的形而上的嗤之以鼻(也许我是这坛子里最旗帜鲜明的反对博客园的人,不过我无所谓,博客园那种的确应该批判),对于你的问题俺们说,如果j基于EF是延后滴,那么你就提供iqueryable<T> 有何不可 在这种角度来看,你什么dal其实就是多余滴,因为EF延后,你完全可以直接提供,后期where,select,join,left join,group joip人家通通可以,你做个固定死滴什么形式上的model没有任何意义 ps:这里的model需要澄清一下,老p说model固定,那是指逻辑上的model,而不是值dbmodel,一表实体也就只能是博客园那些家伙能玩滴出来,实际一线编程人员绝不认为一表一实体是真理
  • 打赏
  • 举报
回复
model当然可以有很多种。但是“三层”中的model,我们可以独立出来。知道针对数据库每一个数据表的所谓model,以及针对UI每一个窗体控件的ViewModel,跟三层没有必然的联系。虽然他们的名字中也有model这个词儿
  • 打赏
  • 举报
回复
如果你纠结什么DAL层,那么你随便整什么Model。但是这跟三层的“Model”没有什么必然的关系。比如说你使用EF,或者别的什么模式,那都是你自己要使用数据库驱动而整的什么class,跟三层无关。有些人非要围绕着每一个数据库表再去定义什么class,那是他自己愿意瞎折腾。讲求效率的人,直接在BLL中使用ADO.NET或者EF之类的,直接读取数据,直接创建Model对象(或者对象集合)。 同样地,表现层的ViewModel跟三层的Model也没有必然的关系。比如说我有一个页面是显示“好友列表”的,那么我的这个界面组件的ViewMode就是用于给界面绑定列表数据、以及“刷新、加载更多、打开好友窗口”等功能的。协调多种界面的数据对象,以及打开另一个窗口的操作,都是ViewModel上定义的,而界面的列表的SourceItems属性以及几个按钮的Click事件跟ViewModel绑定,这样就能在我们剥离开美工技术以外直接定义一些编程方法。
wanghui0380 2014-07-02
  • 打赏
  • 举报
回复
其实我能明白老p的说法,他的model其实基于业务逻辑,业务逻辑如此当然没啥可说滴,只是lz这种问法,明显是博客园那种形式大于逻辑的搞法,如果是博客园那种形式大于逻辑的弄法,自然各自管各自滴,毕竟形式主义的弊病就是只管形式,不管逻辑
加载更多回复(32)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧