C#简单构架之EF进行读写分离+多数据库(MYSQL/SQLSERVICE)

C#简单构架之EF进行读写分离+多数据库(MYSQL/SQLSERVICE)

  • 商品编号:
    #18803835_188
    • 原价:
      免费
    • 会员价:
      免费
  • 分类:
    • V1.0_数据库分离
  • 数量:

购物车中已存在此商品,请在购物车中操作单击跳转购物车

  • 拥有者:追随微笑
  • 开发语言:C#
  • 开发环境:Visual Studio
  • 数据库:Mysql/SqlServer
  • 商品架构:B/S
  • 代码管理工具:无
  • 大小(M):40.5 M
  • 编码格式:UTF-8
  • 是否开源:是
  • 开源协议:BSD协议
  • 博客地址:http://www.cnblogs.com/kq123321/p/7002054.html

最近因为项目需要,研究了下EF的读写分离,所以做了一个demo进行测试,下面是项目的结构


表现层view

  主要提供Web、WebApi等表现层的解决方案

公共层public

   主要提供项目公共类库,数据缓存基础方法等

实体层model

   主要提供数据库映射模型,还有就是DDD领域操作模型

数据层Db

   主要封装EF操作基础类

数据服务层Service

   主要提供数据库操作服务、缓存操作服务

数据接口服务层inface

   主要提供数据库操作服务接口、缓存操作服务接口

1.首先是多数据库的支持,目前就支持mysql/sqlservice,如果需要添加更多的数据库支持,只需要再数据库操作类型上面添加即可

/// <summary>    /// 数据库类型
/// </summary>
public enum DbContextType : byte
{
    SqlService = 1,
    MySql = 2
}

分别对mysql/sqlservice的上下文操作进行封装

/// <summary>
/// MySql操作类
/// </summary>
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MySqlContext : DbContext
{
    public DbSet<Test> TestEntities { get; set; }
    /// <summary>
    /// 配置默认的字符串链接
    /// </summary>
    public MySqlContext() : base("DefaultConnection") {
    }
    /// <summary>
    /// 自定义数据库链接
    /// </summary>
    /// <param name="connenction"></param>
    public MySqlContext(string connenction) : base(connenction) { }
    /// <summary>
    /// 实体对应规则的映射配置
    /// </summary>
    /// <param name="modelBuilder"></param>
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    }
}
/// <summary>
/// Sql数据库操作类
/// </summary>
public class SqlServiceContext : DbContext
{
    /// <summary>
    /// 配置默认的字符串链接
    /// </summary>
    public SqlServiceContext() {
    }
    /// <summary>
    /// 自定义数据库链接
    /// </summary>
    /// <param name="connenction"></param>
    public SqlServiceContext(string connenction) : base(connenction) {
    }
    /// <summary>
    /// 实体对应规则的映射配置
    /// </summary>
    /// <param name="modelBuilder"></param>
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    }
}

在view调用时候,进行ef上下文初始化只需要设置类型

/// <summary>
/// 数据库策略初始化类
/// </summary>
public static class DBInitializer
{
    public static DbContextType DbContextType { get; set; }
    /// <summary>
    /// 数据库初始化策略配置
    /// </summary>`
    public static void Initialize(DbContextType ContextType)
    {
        string IsUsedWR = System.Configuration.ConfigurationManager.AppSettings["IsUsedWR"];
        DbContextType = ContextType;
        ///获得数据库最后一个版本
        //   Database.SetInitializer<DBContextHelper>(new MigrateDatabaseToLatestVersion<DBContextHelper, DBConfiguration>());
        if (ContextType == DbContextType.SqlService)
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<WriteSqlServiceContext, WriteSqlServiceDBConfiguration>());
            if (IsUsedWR == "1") {
                Database.SetInitializer(new MigrateDatabaseToLatestVersion<ReadSqlServiceContext, ReadSqlSqlServiceDBConfiguration>());
            }
            else
            {
                Database.SetInitializer<ReadSqlServiceContext>(null);
            }
        }
        else
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<WriteMySqlContext, WriteMySqlDBConfiguration>());
            if (IsUsedWR == "1")
            {
                Database.SetInitializer(new MigrateDatabaseToLatestVersion<ReadMySqlContext, ReadMySqlDBConfiguration>());
            }
            else
            {
                Database.SetInitializer<ReadMySqlContext>(null);
            }                
            //Database.SetInitializer<WriteMySqlContext>(null);
            // Database.SetInitializer<ReadMySqlContext>(null);
        }
        // Database.SetInitializer<DBContextHelper>(null);
        ///删除原来数据库 重新创建数据库
        //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ContextHelper>());
        // Database.SetInitializer<ContextHelper>(new DropCreateDatabaseIfModelChanges<ContextHelper>());
    }
}
public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        //Autofac
        //ContainerBuilder builder = new ContainerBuilder();
        //builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
        //IContainer container = builder.Build();
        //DependencyResolver.SetResolver(new AutofacDependencyResolver(container));


        //Autofac初始化过程
        ContainerBuilder builder = new ContainerBuilder();
        builder.RegisterControllers(System.Reflection.Assembly.GetExecutingAssembly());//注册mvc容器的实现  
        var assemblys = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList();
        builder.RegisterAssemblyTypes(assemblys.ToArray()).Where(t => t.Name.Contains("Service")).AsImplementedInterfaces();
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        //初始化数据库
        DBInitializer.Initialize(DbContextType.MySql);
    }
}

通过上面多数据库的支持已经完成,下面进行读写分离,分别进行继承上述上下文操作

/// <summary>
/// 读
/// </summary>
public class WriteSqlServiceContext : SqlServiceContext
{
    public WriteSqlServiceContext() : base("") { }
}
/// <summary>
/// 写
/// </summary>
public class ReadSqlServiceContext : SqlServiceContext
{
    public ReadSqlServiceContext() : base("") { }
}

通过工厂类进行初始化

/// <summary>
/// 上下文工厂类
/// </summary>
public static class Contextfactory
{
    /// <summary>
    /// 获取上下文
    /// </summary>
    /// <returns></returns>
    public  static DbContext GetContext(DbOpertionType OpertionType)
    {
        DbContextType ContextType = DBInitializer.DbContextType;
        if (ContextType == DbContextType.MySql)
        {
            if (OpertionType == DbOpertionType.Read)
                return new ReadMySqlContext();
            else
                return new WriteMySqlContext();
        }
        else
        {
            if (OpertionType == DbOpertionType.Read)
                return new ReadSqlServiceContext();
            else
                return new WriteSqlServiceContext();
        }
    }
    /// <summary>
    /// 获取上下文操作
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    /// <param name="OpertionType"></param>
    /// <returns></returns>
    public static TEntity CallContext<TEntity>(DbOpertionType OpertionType) where TEntity: DbContext
    {
        var DbContext = GetContext(OpertionType);
        return (TEntity)DbContext;
    }
}

最后配置webcofig即可

<!--数据库配置(WriteMySqlConnection:读数据库,ReadMySqlConnection:写数据库   如果无需要进行 就配置IsUsedWR,2个链接都写写入库)-->
  <connectionStrings>
    <add name="WriteMySqlConnection" connectionString="data source=*; Initial Catalog=YK_Test_WriteDB ; uid=root; pwd=yk12345;Charset=utf8" providerName="MySql.Data.MySqlClient" />   
    <add name="ReadMySqlConnection" connectionString="data source=*; Initial Catalog=YK_Test_ReadDB ; uid=root; pwd=yk12345;Charset=utf8" providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
<!--数据库读取分离配置-->
    <!--是否开启读写分离  1:开启  0:不开启-->
    <add key="IsUsedWR" value="1"/>

最后进行测试

public class TestController : Controller
{
    private ITestService _TestServiceDb { get; set; }

    public TestController(ITestService TestServiceDb) {
        _TestServiceDb = TestServiceDb;
    }
    // GET: Test
    public ActionResult Index()
    {
        var result = _TestServiceDb.AddEntity(new Test() { ID=Guid.NewGuid(), Age=11, CreateTime=DateTime.Now, Name="Test" });
        var NewResult = _TestServiceDb.GetEntityByID(result.ID);
        return View();
    }
}


搞定,可能在代码上有点累赘,但是总算是可行的。

    版权所有:追随微笑


权利声明:本站所有商品信息、客户评价等信息是初心商城重要的数据资源,未经许可,禁止非法转载使用。 注:本站商品信息均来自初心商城,其真实性、准确性和合法性由初心商城负责。

                  初心源说明:初心商城主要为程序员提供开发基础的代码源以及成熟项目,网站中所有的商品有提供收费版本的, 也有提供免费版本的,按照大家各自不同的需求进行购买。实实在在的让程序员只用专注于自己的业务实现你的小梦想, 如果您对我们的成果表示认同并且觉得对你有所帮助我们愿意接受来自各方面的支持^_^。

                  支持:用手机扫描二维码支付

                  支付宝支持我们 微信支持我们

                  您的支持将被用于:
                  1、持续深入的上传更多更好的源代码
                  2、建立更加完善的技术社区
                  3、完善现在系统出现各种问题
                  4、购买域名和租赁服务器

                  1、交易规则

                  2、发货方式

                  1、自动:在上方保障服务中标有自动发货的商品,拍下后,将会自动收到来自卖家的商品获取(下载)链接

                  2、手动:在上方保障服务中标有手动发货的商品,拍下后,卖家会收到邮件,也可通过QQ或订单中的电话联系对方。

                  3、退款说明

                  1、描述:源码描述(含标题)与实际源码不一致的(例:描述PHP实际为ASP、描述的功能实际缺少、版本不符等)

                  2、演示:有演示站时,与实际源码小于95%一致的(但描述中有"不保证完全一样、有变化的可能性"类似显著声明的除外)

                  3、发货:手动发货源码,在卖家未发货前,已申请退款的

                  4、服务:卖家不提供安装服务或需额外收费的(但描述中有显著声明的除外)

                  5、其它:如质量方面的硬性常规问题等

                  备注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。交易中的商品,卖家无法对描述进行修改!

                  4、注意事项

                  1、客户买完之后未确认收货,将不会收到下载地址和下载码,确认收货之后才能收到下载地址和下载码。

                  2、在未拍下前,双方在QQ上所商定的内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准);

                  3、在商品同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外);

                  4、在没有"无任何正当退款依据"的前提下,写有"一旦售出,概不支持退款"等类似的声明,视为无效声明;

                  5、虽然交易产生纠纷的几率很小,但请尽量保留如聊天记录这样的重要信息,以防产生纠纷时出现问题不明确的情况。

                  5、交易声明

                  1、本站作为直卖平台,依据交易合同(商品描述、交易前商定的内容)来保障交易的安全及买卖双方的权益;

                  2、非平台线上交易的商品,出现任何后果均与本站无关;无论卖家以何理由要求线下交易的,请联系管理举报。

                  初心Logo

                  初心商城| 初心系列| 初心博客| 版本历史| 系统反馈

                  © 2016-2018 山西米立信息技术有限公司 保留所有权利 京ICP备16055626号
                  违法和不良信息举报电话:186-2950-9347,本网站所列数据,除特殊说明,所有数据均出自我工作室
                  本网站兼容所有主流浏览器,不支持手机自适应

                  返回顶部小火箭