Asp.Net MVC +WCF+EF+Spring 实现云效果!

这篇博客给大家介绍一下如何通过Asp.Net+WCF+EF实现云效果!

首先给大家介绍一下什么是云效果。

这次我们做的项目叫做高校云平台,“云”其实是互联网的一个隐喻,“云计算”其实就是使用互联网来接入存储或者运行在远程服务器端的应用,数据,或者服务。在这个项目当中我们秉承着SaaS:Software-as-a-Service(软件即服务)的原则,就是说我们开发一个系统后部署在远程服务器上,其他想用这个系统的人都通过网络来运行就可以了,就是SaaS了。

高校云平台他首先是为高校服务的一套系统,处理的学校的新生入学,学生信息维护,期末考试,评教…….等工作。但是问题来了,我们既然为每个学校都提供了一套服务,那么我们是不是应该为数据的安全性,数据独立性,考虑一下呢!针对如何存储数据我们想到了三个解决方案。

1.独立数据库

2.共享数据库,隔离数据表

3.共享数据库,共享数据表

这三个方案各有优缺点,独立数据库,每个学校一个数据库,独立性无疑是很好的,但是他会很占用空间,公测阶段那么多人注册了用户,每个用户都需要有一个库,这样太占用资源了!共享数据库,隔离数据表,这样就是说,所有的学校用一个数据库,但是数据库下有多套数据库表,其实这种方式感觉跟独立数据库差不多。可能就免的建立数据库了!共享数据库,共享数据表,这样所有的用户就用一套数据库,一个数据库表,但是每个学校的数据用一个字段来表示,这样做确实会很省空间,但是数据量一大之后,我们就会效率就会很难被保障了。

后来经过分析,我们选择了,每个学校用一套数据库,这样数据库的独立性,安全性,都会被保障。下边来看一下,我们是如何实现这种效果的,每个人登陆后,能看到自己的数据!

先说一下思路,登陆以后--->取到该用户的登陆信息---->通过wcf传递到服务端---->写入线程变量中,在我们实例化数据库上下文的时候,从线程变量中取出!

下边给出几个关键地方的代码!

1.定义一个BaseController,该类中有一个保护类型的变量,让其他的controller继承这个controller。

<span style="font-size:18px;">namespace LFBidSystem.Controllers
{
     public class BaseController : Controller
     {
	  //每个controller都有的一个变量。用来存放
	  protect string connectionString = "";
     }
}</span>

2.定义一个拦截器,在每个controller内的action执行之前,都要拦截,并执行controller中的方法!

<span style="font-size:18px;">	namespace LFBidSystem.Controllers
	{
	    public class SwtichDbfilter : ActionFilterAttribute
	    {
	        public override void OnActionExecuting(ActionExecutingContext filterContext)
	        {
	            //获取当前controller 的实力
	            BaseController cl =(BaseController) filterContext.Controller;

	            //给当前调用的controller赋值,本初采用的假数据!
	            cl.connectionString = "Data Source=192.168.24.233;user id=sa;password=123456;persist security info=True;database=SwitchDataSource";
	        }
	    }
	}
</span>

3.这样,我们当前调用的controller的connectionString变量就会有值了!这样我们就可以在调用wcf的时候,将这个参数传递到服务端,

<span style="font-size:18px;">	namespace LFBidSystem.Controllers
	{
	    public class testController : BaseController
	    {
	        IUserInfoWCF iUserInfoWcf = ServiceFactory.GetUserInfosService();
	        public ActionResult Index()
	        {
	            string userInfo = Request["userInfo"];
	            ViewData["userInfo"] = userInfo;
	            return View();
	        }

	        public string Login() { 

	             UserInfoViewModel enUser = new UserInfoViewModel();
	            //获取用户名
	            string strUserName = Request["userName"];
	            //获取密码
	            string strPassWord = Request["passWord"];

	            //调用wcf 的方法  进行登录
	            UserInfoViewModel enUserInfoVM = new UserInfoViewModel();
	            enUserInfoVM.UserName = strUserName;
	            enUserInfoVM.PassWord = strPassWord;
	            //取得链接字符串的值,这个值在filter 中已经赋值了!
	            enUserInfoVM.DataSource = this.connectionString;

	            try
	            {
			传递的变量中,包括connectionString 的值!
	                enUser = iUserInfoWcf.Login(enUserInfoVM);
	            }
	            catch (Exception e)
	            { }
	            return enUser.other;
	        }

	    }
	}
</span>

4.我们拿到传递过来的connectionString,并将这个值写入到线程变量中!

<span style="font-size:18px;">namespace LFBidSystem.WCFService
{
      public partial class ServiceBusiness : IUserInfoWCF
	    {
	        //拿到业务逻辑层的接口
	       // IUserManagerBll iUserManagerBll = SpringHelper.GetObject<IUserManagerBll>("UserManager");
	        IUserManagerBll iUserManagerBll = null;
	        #region   Login   登录   张宏杰 2015年6月6日16:37:19
	        /// <summary>
	        /// 登录
	        /// </summary>
	        /// <param name="enUserInfoVM">用户信息实体</param>
	        /// <returns>提示条信息</returns>
	        public UserInfoViewModel Login(UserInfoViewModel enUserInfoVM)
	        {
	            //设置连接字符串到线程变量中
	            CallContext.SetData("databaseId", enUserInfoVM.DataSource);
	            iUserManagerBll = SpringHelper.GetObject<IUserManagerBll>("UserManager");
	            return iUserManagerBll.Login(enUserInfoVM);
	        }
	        #endregion
	    }
}
</span>

5.在我们实例化数据库上下文的时时候,我们要拿到这个链接字符串来进行实例化!这样我们实例化的上下文对象就是对链接字符串对应的那个库进行操作了!

<span style="font-size:18px;">namespace LFBidSystem.DAL
{
    public class BaseDal<T> : CoreBaseDal<T> where T : class,new()
    {
        public SchoolWoeDbContext switchDataSourceEntity;

        public override void SetDbContext()
        {
            //从缓存中取出上下文的链接信息
          string databaseId =  CallContext.GetData("databaseId").ToString();

          DbContext db = CallContext.GetData("DbContextFactory") as SchoolWoeDbContext;

            if (db == null)
            {
                //根据数据库上下文的链接信息,实例化数据库上下文。该上下文会采用才链接字符串进行创建!
                db = new SchoolWoeDbContext(databaseId);
                //从缓存中拿到这个信息
              //  db = SpringHelper.GetObject<DbContext>("SwitchDataSourceEntities");
                //TODO:DbContext,线程内缓存,不适用于集群,后期分布式缓存进行处理,key为guid
                CallContext.SetData("DbContextFactory", db);
            }
            this.MyBaseDbContext = db;
            switchDataSourceEntity = (SchoolWoeDbContext)db;
        }

    }
}
</span>

6.我们的ORM框架采用的是EF,都知道他有三种模式,具体那种模式的好处,有缺点,我们可以查一些资料,本架构采用的是codeFirst。数据源上下文类。

<span style="font-size:18px;">namespace ModelText
{
    public class SchoolWoeDbContext : DbContext
    {
        public SchoolWoeDbContext(string ConncectionString)
            : base(ConncectionString)
        {
            this.Database.CreateIfNotExists();
        }

        public virtual DbSet<T_User> T_User { get; set; }

        public virtual DbSet<T_DataSource> T_DataSource { get; set; }
    }
}
</span>

通过这些操作,我们的动态切换数据源就可以很好的实现了!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-12 00:33:13

Asp.Net MVC +WCF+EF+Spring 实现云效果!的相关文章

翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 1

原文地址:http://ddmvc4.codeplex.com/ 原文名称:Design and Develop a website using ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 另一种 MVC 应用程序: 简介 站点总是快速成长,一旦开始成长,站点就变得很难开发,组织和维护.所以在我们增加功能或者开发项目的时候,缺乏设计的大型网站会变得失去控制.这里要说的是站点的架构设计必须简单,容易被任何设计者理解 ( 从初级开发者到中级开发者 ),以及

翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 3

原文地址:http://ddmvc4.codeplex.com/ 原文名称:Design and Develop a website using ASP.NET MVC 4, EF, Knockoutjs and Bootstrap Part 1: 创建 Web Application (Knockout.js, Asp.Net MVC and Bootstrap): 前端设计 在开始 UI 部分之前,我们先看一下在 ASP.NET MVC4 中使用 Knockoutjs 和 Bootstrap

ASP.NET MVC和EF集成AngularJS开发

参考资料: 如何在ASP.NET MVC和EF中使用AngularJS AngularJS+ASP.NET MVC+SignalR实现消息推送 [AngularJs + ASP.NET MVC]使用AntularJs快速建立ASP.NET MVC SPA網站

ASP.NET MVC+WCF+NHibernate+Autofac 框架组合(一)

学习了Spring.NET+NHibernate的框架,觉得Spring.NET框架不够轻量,配置来配置去的比较头疼,所以把Spring.NET换成了Autofac框架,同时加入WCF框架整了一个组合. 本来想把NHibernate换成EF的,因为现在普通用的.net 4.0,但是.net 4.0里的EF对Oracle支持没那么好,.net4.5有了oracle新的驱动就挺好用了. 一点点心得,NHibernate也是刚熟悉,给像我一样的新手参考,一起学习,有什么不够合理的地方还请多多指教. 数

ASP.NET MVC 5 + EF 6 入门教程 (5) Model和Entity Framework

文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-ef-6-get-started-model.html 上一节:ASP.NET MVC 5 入门教程 (4) View和ViewBag 源码下载:点我下载 MVC中的Model是用来给View提供显示数据的对象. 这里我们首先创建一个Model对象. 在解决方案资源管理器中右键点击Models文件夹,选择添加->类.添加一个名为Employee.cs的Model类.Models文件夹

翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 6 - 业务逻辑

Part 3: 设计逻辑层:核心开发 如前所述,我们的解决方案如下所示: 下面我们讨论整个应用的结构,根据应用中不同组件的逻辑相关性,分离到不同的层中,层与层之间的通讯通过或者不通过限制.分层属于架构风格,在应用的长时间生命周期中,解决维护和扩展问题.所以,让我们在解决方案中添加一个类库项目,命名为 Application.Common. Application.Common : 这是一个类库项目, 提供公共功能,可以被不同的业务逻辑层使用.例如:安全,日志,跟踪,验证等等. 定义在这个层中的组

如何在ASP.NET MVC和EF中使用AngularJS

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) AngularJS作为一个越来越流行的前端框架,在使用ASP.NET MVC和实体框架开发Web应用的时候,恰当的使用它可以让你的前端界面更易开发.今天推荐的文章就是介绍如何把AngularJS结合到ASP.NET MVC开发当中. 虽然之前开发的一套SaaS系统也是以ASP.NET MVC.实体框架为基础,前端辅以AngularJS.不过一直无暇很好总结一下这方面的经验分享给大家,刚好今天推荐的文

Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性

今天有个同事问到,在使用Entity Framework 的Database frist或model first时,怎么在model上添加验证的特性? 因为此时的Model是是VS 工具怎么生成的,直接加attribute到modle类上是太现实也不合理.一个比较合理做法,就是用 buddy class的方式来实现. 比如有一个Model类: Movie.那我们就可以添加一个局部类文件,局部类的内容如下: using System.ComponentModel.DataAnnotations;

[ASP.NET MVC]: - EF框架学习手记

1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架. 2.什么是ORM?ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的互相转换.(表实体跟表之间的相互转换)ORM框架有很多,EF框架是ORM框架的其中一种,是实现了ORM思想的框架. O=>表实体M=>映射关系R=>数据库.表 3.创建EF,添加-新建项-ADO.NET 实体数据模型<configuration>  <