有一个用户类,我是这么写的
public class User { private string userId; private string userName; private string password; private string[] powers; public string UserId { get { return userId; } set { userId = value; } } public string UserName { get { return userName; } set { userName = value; } } public string Password { get { return password; } set { password = value; } } public string[] Powers { get { return powers; } set { powers = value; } } public void Load() { } public void Save() { } public void Delete() { } public void HasPower() { } }
但发现了以下几个问题
1、无法从数据库初始化一个实例,Load方法是不是要写成静态的,还是要怎么做?
2、如果我要列出所有的用户,我不知道该放到哪个类里面?
现在脑子有点乱,想不清楚,谁能帮帮我啊!
1. User只是一个数据模型,具体数据从哪儿来,怎么来(这些好像就是你要写到Load方法里的),跟模型没有关系。加载数据的实现应当由数据层其他代码完成。试想你在load里写了从数据库加载User对象,那么这个User模型就钉死了只能从数据库来,其他项目想从xml读取一个user,就不能复用你的user类,哪怕他们一模一样。
2. 为什么一定要放到某个类里呢。列出所有用户看起来是一个操作,那么它应当是某个方法的返回值。例如你有一个UserManager类,里面封装的是User的操作:
public List<User> ListAllUsers() { //implementation }
正解
我有点搞不懂,不知道你们是怎么想的。
你们将实体看成是对象,这个我明白,但是你们是怎么看待获取实体列表(查找符合某条件的所有用户)这样的功能的呢,或者直接一点,如果是你,会怎样去设计?
@andrew28: 我回答了啊,有一个UserManager类,里面提供一些对User实体的操作,包括CRUD。
@水牛刀刀: 大半夜来回复,真是太感动了,你的意思是我的User类仅仅包含属性和访问方法吗?不过还是有点困惑:如果包含了诸如Delete的方法,会有什么问题呢,或者是错误
我的User类仅仅包含属性和访问方法吗,
@andrew28: 模型可以设计成两种,一种是“贫血模型”,这类模型只包含数据(以及非常非常少的逻辑),如:
class User { public long ID { get; set; } public string Name { get; set; } public string Address { get; set; } }
你说的那种模型包含大量逻辑的,其实也可以(专业点ms叫“领域模型”我记不清楚了可能有误)。领域模型不适合做web开发,因为web是无状态的。推荐你一本书《Microsoft.NET企业级应用架构设计》(陈黎夫译),里面对此类设计讲的很透彻。一句话两句话很难说明白。
@水牛刀刀: 领域模型不适合做web开发,因为web是无状态的。不敢苟同。把表现层和下面的层次分开来。
@水牛刀刀: 如果是贫血模型,那就有点不太像是面向对象了,我觉得倒更像是“面向数据结构”了,但程序写起来确实比较清楚
@andrew28: 贫血跟面向对象不矛盾的。
@andrew28: 逻辑也可以分为好几种,领域逻辑和具体的应用逻辑应该分开。面向对象的很大一个特点是一个类只做一件事,也就是说一个类只有一个引起变化的原因(SRP)。你如果没有领域逻辑,就不必强把其他逻辑加到领域中的类上面。
@ChatinCode: 那领域逻辑与应用逻辑有什么区别呢?问得有点多了,呵呵--!
@andrew28: 具体还是看看面向对象设计的基础书吧,应用逻辑无法重用,而领域逻辑可以在针对同一领域的不同应用中重用。应用逻辑(具体是不是应该这么叫也不大清楚了)与领域类可以没有关系,而跟具体的Use Case有很大联系。一下子也想不到好的例子。
把你的方法從實體中拿掉。在另一個地方初始化數據庫,然後填充 這個實體。
使用三层架构的方式,你就不会感觉乱了,第一层中的方法都可以被上一层随意调用,这样就灵活多了。。。
1.初始化数据时,建议在构造函数各来实现,这样会比较方便,性能较佳;
2.若要列出所有用户,则可以使用List列表结合实体类User来实现,List<User> listUser=new List<User>();
建议看看 <企业应用架构模式> 和 <Mircrosoft .net 企业级应用架构设计>,你这种设计应该是叫 Active Record模式吧。最后看看<领域驱动设计>