日期:2014-05-18  浏览次数:20587 次

关于三层架构的一点困惑-表示层or数据访问层?
如果采用三层架构开发web应用程序,文件上传功能用FileUpload控件,那么,实现文件上传功能的代码应放到表示层还是数据访问层?
(1)如果放到表示层,好像不合理。操作文件,应该是数据访问层的职责。
(2)如果放到数据访问层,好像又不好写代码,上传文件的代码通常如下:

//获得服务器文件当前路径
string path = Server.MapPath("~");

//把上传文件保存在当前路径的 upload 文件夹中

FileUpload1.PostedFile.SaveAs(path + "\\upload\\" + FileUpload1.FileName);

lblInfo.Text = "文件保存成功";

不知道如何把上传代码放到数据访问层。

请指点困惑,究竟该放到哪一层,如何来做?谢谢!

------解决方案--------------------


新建一个类PageBase 继承Page.Web.UI.Page类

里面写个通用上传方法

private void UploadMethod(FileUpload fu,string savePath,Label lab)
{
fu.PostedFile.SaveAs(savePath);

lab.Text = "文件保存成功";


然后在要用到上传功能的页面应用

一般页面继承的是Page.Web.UI.Page类,现在改为继承上面创建的类PageBase,以后页面都可以共用

PageBase可以放在App_Code文件夹中,也可以放到其他文件夹中。
------解决方案--------------------
都可以,一般放在表示层,即可
------解决方案--------------------
另外对于上传的话,我们通常会抽象一个类出来放在工具类库里面,提高复用
------解决方案--------------------
一般来说三层只是为了分离,我们在实际开发中不需要为了三层而三层. 我们只需要那种方式代码的重用高,易看,易读就可以了, 想你的上传功能,只要涉及到数据库操作,完全可以在表示层建一个类写在其中了
------解决方案--------------------
对于许多人来说,asp.net程序就是一个人单机小程序,只不过因为其部署方便所以抵挡一阵网络应用的需求。在其开发时它并不独立思考业务逻辑层设计问题,总是以为在编写界面时自由地随便修改数据库表是很方便的。

这个就像是一些人的生活习惯,不离开家乡背井离乡的话,就想不到改变。
------解决方案--------------------
可以放到一个公用类里面
------解决方案--------------------
这种asp.net本地处理小程序本来就很容易纠结,也没有什么大格局,如果你写的程序太小、涉及不到不同能力的人分工设计,那么分层作用就更难看出来了。甚至FileUpload1.PostedFile.SaveAs本身就是封装死了的本地代码,它就不考虑分层,你再没有分层的需求,那么自然提不出什么分层的必要。

从你的问题看不出分层的概念。

真正的分层设计,就是搞懂业务逻辑层,这就行了。例如一个图片分享网站围绕着图片的需求设计好十几个业务逻辑层并且反复论证,然后让美工设计师设计好交互表现层,最后才去想什么图片存储和查询的问题(例如它可以使用GFS)。有这个良好的设计习惯,才有分层。

而看看你的问题描述,整个就是纠结于一个编程语句,也不理解和分析业务,怎么可能去设计业务逻辑层呢?会点计算机语言的语法的编程者如果不去懂业务,怎么可能分层设计呢?
------解决方案--------------------
设计好十几个业务逻辑层并且反复论证 --> 设计好业务逻辑层的十几个api方法并且反复论证
------解决方案--------------------
小弟也遇到这样问题,纠结中
------解决方案--------------------
有经验了,就自然这样想了,现在也急不来
------解决方案--------------------
C# code
动手 再查查资料  慢慢就好了。。。。

------解决方案--------------------
为三层而去三层就没意义了
------解决方案--------------------
探讨

另外对于上传的话,我们通常会抽象一个类出来放在工具类库里面,提高复用

------解决方案--------------------
如果只是简单的文件上传的话放到表示层就可以了。。
但是如果还有比较复杂的文件操作的话。。我一般是建个。。Common曾。。放一些公共的长会用到的方法。。。
------解决方案--------------------
其他层的话传参数就可以了。。。。。。最好判断一下 文件的大小和格式。。。。。。。
------解决方案--------------------
探讨
新建一个类PageBase 继承Page.Web.UI.Page类

里面写个通用上传方法

private void UploadMethod(FileUpload fu,string savePath,Label lab)
{
fu.PostedFile.SaveAs(savePath);

lab.Text = "文件保存成功";
}

然后在要用到上传……

------解决方案--------------------
如果你这个“文件保存”功能要在很多地方使用,那最好在数据层做一个类或方法。
然后在表现层的CS中实例化。