本来我打算采用ajax提交请求,异步的请求获取数据,但是我发现如果这样的话就会拖慢开发的进度,拖长时间。所以在这篇博客中仿照首页的列表设计其实和左侧列表网站分类采用了同样的方式,通过局部视图的方式呈现。
我在显示的时候采用了htmlHelper的RenderAction方法,至于我为什么特别喜欢用这个方法来组件一个页面?我的回答可能就是个人喜好,毕竟我看的Mvc书籍中也没有说必须采用哪种方法,或者哪种方法更好,但是我记得在哪个博客中看到过html.Action和html.RenderAction的性能差异?RenderAction的性能会好那么一点点?只是一点点。所以我记住了这个方法,如果没有特别说明,我一直都是采用这种做法。如果您有其他意见,可以提出来,毕竟我的知识有限,可能存在错误。
在开始之前我还想啰嗦依据,就是我在第一篇博客中说过,会采用到IOC、Nhibernate等框架来协同的开发这个小型的网站,我一般采用的方式都是先采用原始的方式操作,然后再通过采用这些框架来展示它们强大的威力。这样更容易理解,也更有说服力。当然,我没有当过老师,可能我的这种做法是错的,但是我当过学生,我个人认为这样是一个好的方式。还是那句话,如果您有更好的意见,欢迎您提出来,我会积极改进。
言归正传,下面开始:
首先我们来分析一下博客园的首页列表设计,在列表中最主要的就是标题、简略的内容(说到内容,我想起来在设计数据库的时候有园友提出来,可以把内容单独的放到一个表中,这样便于Lucene.net建立索引。我对他的意见也很同意,但是我最后还是把博客内容放到了博客表中。因为我发现如果单纯的把博客内容放到一个单独的表,因为我发现我我在做博客园的找找看功能的时候也是可以通过查询数据库来建立索引,放到单独表中可能增加灵活性,符合数据库设计规范,但是我认为好的设计不一定会完全符合数据库设计(比如冗余),我并不是说我的数据库设计很好,到现在为止,我也在不断的调整数据库,插曲)、作者(用户名)、发布时间、评论次数、阅读次数,这些数据显示。当然下面还需要一个分页,我现在先不采用Ajax方式异步请求,我先采用MVCPager进行分页,以后在完成这些小功能进行重构的时候我们再一起修改成ajax。或者我修改成ajax,提交代码,大家看一下,因为毕竟这个分页没有什么好说的。网上有现成的分页代码,每个公司也都会有。
通过分析,博客标题、内容、发布时间我们可以从博客表中取得数据,用户名需要通过该博客AuthorID查找对应的AuthorName,评论次数则可以通过评论表、阅读次数可以通过博客阅读次数表来获取,具体的数据表结构我就不细说了。
我们在项目要采用Autofac(IOC组件)来进行依赖注入,通过构造函数注入,避免在需要的地方需要逐个的定义类的实例。关于IOC—AutoFac,我打算下次专门做一个小例子来显示一下。博客园中关于Autofac的讲解也有很多。
既然要使用Autofac,那么我们就需要注册类型。首先我们在global.asax中注册接口以及实现类。
public void ReigsterOnApplicationStart()
{
var builder = new ContainerBuilder();//构造一个容器
var iservices = Assembly.Load("IServices"); //Iservices是所有提供具体实例的接口所在命名空间
// builder.RegisterAssemblyTypes(iservices);
var data=Assembly.Load("ImpServices");//这个是具体实现类命名空间
// builder.RegisterAssemblyTypes(data).AsImplementedInterfaces().SingleInstance();这种方式表示会创建单个实例,也就是设计模式中的单例模式,在整个的应用程序中只有唯一的实例存在
builder.RegisterControllers(Assembly.GetExecutingAssembly());//注册所有的controller
var container = builder.Build();//创建具体的实例
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//设置MVC框架的依赖注入解析器为AutofacDependencyResolver并且将注册的类型实例传入 这就是MVC的扩展一方面
}
在定义好了或者说配置好了AutoFac以后,就需要在应用程序初始化的时候进行注册,这样这些变量才可以在程序启动的时候就开始工作。在Application_start方法中进行注册。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ReigsterOnApplicationStart();//注册AutoFac
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
通过以上方式就可以在程序中使用Autofac框架所带来的便利,当然会有网友大呼,那么简单,的确通过这些配置(或者应该叫注册,因为配置很容易联想到XML)就可以轻松的实现依赖注入,在程序中进行使用了。
我在中间多说一句,这些框架使用起来都很简单,但是要正确的使用还是要花些功夫的,毕竟web form如果只是托控件,确实比Java要简单一万倍,这也就是Java程序员有时会看不起我们.Net程序员的原因我想。但是真正在实际的项目中,正确的使用,那我们真要仔细研究一下。
在我们注册了Autofac之后,就可以使用了?我们通过构造函数注入(依赖注入方式分三种:属性注入、构造函数注入、接口注入)来应用到本项目中。
因为我们目前要实现的功能是首页中间列表功能,所以我们就以这个为例。
首先我们要创建BlogController负责所有的与博客相关的逻辑。在新建好BlogController之后,我们要创建BlogController的构造函数,如果不使用AutoFac,我们根本不需要创建BlogController的构造函数。我会在代码后面进行必要的注释
public class BlogController : Controller
{
//
// GET: /Blog/
private readonly IBlogServices _blogServices;//定义博客服务类接口
public BlogController(IBlogServices blogServices)//BlogController的构造函数,里面会传递一个IBlogServices (博客服务类BlogServices的接口)
{
this._blogServices = blogServices;
}
public IBlogServices BlogServices
{
get
{
return _blogServices;
}
}
public ActionResult Index(int pageNo, int pageSize)
{
IBlogServices blogServices = BlogServices;//我在这里是通过属性值获取到传递进来的实例变量
List<BlogInfo> listBlog = blogServices.GetBlogListWithPageNo(pageNo, pageSize);//调用具体实例类BlogServices的方法返回必要的数据,这里返回的就是需要在首页显示的数据 PageNo表示页数,PageSIze表示每页显示的个数
ViewBag.BlogList = listBlog;//我通过Viewbag进行值的传递,有的园友提出来我为什么不采用在View(object)这种方式传递,我的回答是采用View(object)需要在View层定义这种类型,我一般习惯在View层定义类而不是这种List<BlogInfo>的形式(个人习惯,没有好坏之分)
return View();
}
}
我说了那么多我自己看了都很讨厌的话,其实我不是一个说话很多的人。现在来看一个例子表示我没有说假话吧
首页列表可以正常的显示了,但是里面还有一些细节我还没有来得及处理。比如点击推荐按钮数值就要加一,通过点击评论可以到达详细内容页的评论列表。这些细节问题我都会慢慢解决。毕竟这才是最浪费时间的地方。
总结一下把,在这篇博客中说是介绍首页列表显示,倒不如说是显示了一下如何简单利用Autofac进行依赖注入,算是意外收获吧。关于依赖注入的相关知识,还请大家参考园中其他高手的博客。我也会在近期整理一下我的笔记,把其中我发现的一些问题描述一下,虽然写这些字很快,但是准备很费时间啊,希望园友们不要责怪我没有很好的完全这个功能的全部。
代码我已经托管到codeplex,有兴趣的朋友可以一起讨论,一起开发。
http://www.cnblogs.com/jiagoushi/archive/2012/12/08/2809152.html 在这篇博客中可以找到
索引:
Asp.net MVC 仿照博客园的简单网站首页 列表设计 (2012-12-11 22:21) | ||||||
为什么要从Web form过渡到MVC中 (2012-12-09 22:43) | ||||||
Asp.net MVC3 企业网站系统高仿博客园 首页左侧列表页面 实现效果 (2012-12-08 19:11) | ||||||
Asp.net MVC 3 开发企业网站系统仿照博客园部分功能--总体设计 (2012-12-05 23:41) | ||||||
Asp.net MVC 3 开发简单的企业系统开篇--数据库 (2012-12-03 21:03) | ||||||
Asp.net MVC 3 开发一个简单的企业网站系统 |