public class User
{
        private int _id;
        private string _username;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        /// <summary>
        /// 返回用户的链接
        /// </summary>
        /// <param name="hasAt">是否包含@符号</param>
        /// <returns></returns>
        public string PutUserHref(bool hasAt)
        {
            if (hasAt)
            {
                return string.Format("<a href='/t/?uid={0}' class='userLink' target='_top'>@{1}</a>", this.Id, this.Name);
            }
            else
            {
                return string.Format("<a href='/t/?uid={0}' class='userLink' target=\"_top\">{1}</a>", this.Id, this.Name);
            }
        }
        /// <summary>
        /// 判断是否登录
        /// </summary>
        /// <returns></returns>
        public static bool IsLogin()
        {
            if (HttpContext.Current.Session["User"] == null || HttpContext.Current.Session["Company"] == null)
            {
                if (HttpContext.Current.Request.Cookies["Email"] != null && HttpContext.Current.Request.Cookies["Password"] != null)
                {
                    string email = HttpContext.Current.Request.Cookies["Email"].Value;
                    string pass = HttpContext.Current.Request.Cookies["Password"].Value;
                    return LoginByEmail(email, Common.DEncrypt.DEncrypt.Decrypt(pass));
                }                return false;
            }
            else
            {                return true;
            }
        }
}
为什么User类里面不能有PutUserHref的属性。我这个属性很多地方的都用到的啊。绑定数据的时候方便的很啊。难道我包了一下还有错?还有就是IsLogin方法。为什么不能再类文件用Session。为什么?代码早就写好了.也能运行正常.但项目经理看到了说 不允许在User写这2种方法.说这样写,思想上就是有错误的.说类文件里面不能出现任何处理html代码的代码以及session....

解决方案 »

  1.   

    这是实体类      按常理来说 只具备 变量以及其属性  
    规范来说  实体类 加方法是不正确的 你要加方法的话就放到App_Code 的类里面去  
    这样才算比较合理            知道了吗?
      

  2.   

    PutUserHref属性干的事好像不是User类要有的功能吧
    IsLogin方法里面含有太多易变的东西了,Session["User"],Session["Company"],Cookies["Email"]。
    假如我把Session["User"]改成Session["user"]了,只变了一个字母,你这方法就要重写了。你完全可以让这个方法接受两个参数,public static bool IsLogin(string email , string pass),从而把这些Session,Cookie易变的东西移出方法
      

  3.   

    有道理,如果你的User类是在model层,这样写显然是不行的
      

  4.   

    这的确是我们的实体类。我们的实体类是允许有方法的。实际上最终会继承activerecord,不知道各位用过没有。只是这个实体类代码我没有贴全。我想说的就是,项目经理认为1.方法里面不能有处理Html标签的方法出现。
    2.Model层不能去读取或者写入Web上的Session或者Cookie
      

  5.   


    从减少依赖的角度来说,确实如此。
    试想如果这个model还要给c/s程序用,却必须引用system.web,让人很不爽吧。
      

  6.   


    楼上见解正确。楼主有没有想到,如果是WINFORM调用你这个类,怎么办呢?
      

  7.   


    c/s里面就没有httpsessio这一说法,httpcontext.current必定会返回一个NULL
      

  8.   

    你想让业务逻辑层的设计师去帮你测试http客户端访问环境?它还要考虑silveright和winform环境吗?
      

  9.   

    其实项目经理这样说也就是随便跟你聊聊。这个问题的责任在于项目经理。我们一般的极限编程开发有一个原则,就是凡是出于测试设计之外的代码,如果把你的代码删除了而测试用例全都可以通过,那么就应该赶紧把你的代码删除了。项目经理直接把你的代码删除了,然后告诉你说你把代码写错了地方,应该在你自己私有的前端代码中去访问http环境数据,这就行了。
      

  10.   

    实体类"
    1.方法里面不能有处理Html标签的方法出现。
    2.Model层不能去读取或者写入Web上的Session或者Cookie
    "这个是对的.第一条:1.方法里面不能有处理Html标签的方法出现。
    举个最浅显的例子.
    你出身的时候穿了衣服打扮得帅帅气气没?
    如果没有就不应该带"处理Html标签"第二条:2.Model层不能去读取或者写入Web上的Session或者Cookie
    也举个浅显的例子.
    一个USB插口能插任何支持其标准的设备,会不会限制死只能插USB移动硬盘?
    这种在Model层去读取web Session与 cookie就如 USB限定了只能插USB移动硬盘
    比喻很粗糙,呵呵,如有些出入,也请忍受,哈哈
      

  11.   

    可能他认为链接应该属于html表现层的东西,你把它在类代码里写死了。这样业务逻辑和表现逻辑没有分清,不利于维护。
      

  12.   

    虽然我是C++程序员,但面向对象思想是一样的。
    我认为你的项目经理的观点是正确的,你的那两个方法应该放到Login这样的类【假如有的话】中。
      

  13.   

    其实我并不认为这个责任你在开发人员,而是在项目经理。它怎么能够事后对开发人员的“设计”说三道四呢?难道他没有在一个“类库”的角度去告诉清楚程序猿“我要怎样测试”吗?在类库的角度,那么就没有先入为主的http环境,于是就相关的测试用例就不会通过。我想这个项目经理也就是一个“分解程序界面给程序员各自去开发”的项目经理,那么就别怪开发人员了!
      

  14.   

    public static bool IsLogin()实体类里还有静态的方法,这样用的也不多吧
      

  15.   

    为了测试module层,我的at还要封装个session 那岂不是很纠结。
      

  16.   

    static  着实让人郁闷 不过 好像高手的代码 总是能够超出规范那么一点
      

  17.   

    你的项目经理可能考虑的是后期应用,主要是HttpContext.Current在某些环节上得不到session和request,比如说在webservice里调用就会发生这种情况,我遇到过。
      

  18.   

    你们项目经理是对的。
    你这样设计不伦不类,那两个属性不是user该包含的动作。
    重温一下uml的理论吧
      

  19.   

    其实,也没啥不可以滴分清楚职责就好了不过对于第一个我是绝对禁止滴,因为职责不在那里对于第二个得分清楚职责,比如这个类的职责就是辅助web项目,那么我认为是可以使用httpcontext滴,只不过不该默认认为 是Session,因为根据实际情况他有可能会是cookie,也有可能会是其他东西另外就算使用session你也不应该假定 信息就一定保存在Session["User"] 里,如果你假定非要保存在这里,那么你还应该对外提供 保存在Session["User"] 里的方法。 因为调用者没必要知道任何内部细节,他只应该知道你提供给他的东西,而不必知道东西是保存在哪里,如何保存滴
      

  20.   

    session相关操作我们一般放在一个公共的页面继承的类里。
      

  21.   

    NND,我本身觉得 弄一个实体类就是一个很S,B的行为..........然后再吧实体的方法都写到另外一个累里,则更S,B反正.net框架中我没看到这么写的。反而跟楼主的思想是一致的。当然写的代码不会像你的那样糟糕。
      

  22.   

    这个类里不能调用html的东西我能理解,但是为嘛实体类里不能有方法??那他跟结构体还有区别吗??谁能给解释一下?
      

  23.   

    本来分离出来就是有争议的,不代表你经理说的就是对的,只不过你在哪个公司你经理说的就是对的。在微软公司,这个就是错的。因为.net框架里有大量属性和方法都写在一起的类。如果你想让你的观点是正确的,你就需要去微软公司工作。
      

  24.   

    你们项目经理理论把握很准,你也很会想问题,不是搞对抗。我怎么就没那么走运,我遇到的连sql 都写在UI。第一,User 应该是Model 类吧。严禁出现业务逻辑。第二,就算复制到业务逻辑对应的类上面,PutUserHref 不算是 User 该有的方法。不算面向对象。根本就不该返回链接字符串。
      

  25.   

    这都 NND什么和什么啊,什么实体 业务逻辑的,都在自欺欺人
      

  26.   


    楼主朋友,我觉得你经理说的没错,类里面为什么一定要带入具体的HTML码呢?你不能在调用这个类的程序里面传入吗?
      

  27.   

    实体类 只是写属性的 而且你那个方法的链接路径还是死的
    Session存取 应该写一个类继承Page 其他页面都继承这个类
      

  28.   

    user类,职责要单一,这个类里面只能写一些与user信息有关的类!
    你所加的islogin等,并不是user类所具有的,你可以再写一个类,来进行这样的判断;
    因为只在user类初始化之后,islogin才有意义,如果user没有初始化,islogin就显得毫无意义!
      

  29.   

        控制实体类分层不上上嘴皮碰碰下嘴皮的事,如果项目经理及架构师在设计结构时并没有按照分层设计,指望程序员自行去分层那是做梦,这点上,如果项目经理的理由是实体类不能这样做,那首先项目经理就有责任。
        如果你做的是界面类,那如何编程是你的权利,关联实体意义的类并不一定是数据层的实体类,在业务层、界面层都可能会出现,好的架构师可以合理的规划不同位置的类的功能,如user类在数据层的功能是增删改查,在业务层的功能是认证、操作、...,在界面层的功能可以是显示、排序...,   但目前看大多做的是一头酱紫而已,如果出问题,板子应该打在架构师及项目经理头上,不过话说回来,你作为程序员,还是应该完全按照项目经理说的做,即使他是错的,因为项目经理有很多事情要处理,这种事情对他来说是很小的无关软件生死的问题,但你如果跟他硬顶,会耗费他大量的精力跟你这个刺儿头较真,倒是真有可能在其他方面坏了大事。
      

  30.   

    "
    为什么User类里面不能有PutUserHref的属性。我这个属性很多地方的都用到的啊。绑定数据的时候方便的很啊。难道我包了一下还有错?还有就是IsLogin方法。为什么不能再类文件用Session。为什么?代码早就写好了.也能运行正常.但项目经理看到了说 不允许在User写这2种方法.说这样写,思想上就是有错误的.说类文件里面不能出现任何处理html代码的代码以及session....
    "你们经理说的是对的按照软件架构的设计思想,软件模块应该单一职责并且易于测试(其实还有很多,这里只说这两个)你的putXXX方法是输出都看的出来,但是输出的是直接控制外部的显示效果,这个显示效果不应该是由此类控制的,应该是由外部控制才对,User类的职责是提供数据,而不是数据和显示效果。此处建议你了解下MVC模式"不能出现任何处理html代码的代码以及session...."
    这也是对的,你使用起来虽然很方便,但是你没有考虑到如此编程User对象就和Web容器提供的对象耦合在一起了,单元测试的时候你怎么办?解决方案可以采用IOC或参数传递依赖的方法做设计的时候不要只想目前的使用,而要全面考虑到扩展、测试、容错、弹性等的问题,努力吧。
      

  31.   


    这个应该是Tech Leader 的责任吧就楼主所提的问题,我个人是极其反对在实体类中拼接html代码的,拼接html是页面的职责。你只要想想,如果这个链接变了...