zoukankan      html  css  js  c++  java
  • MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 六:支持多数据库操作

    本次主要内容:修正MongoDB.Repository框架对多数据库的支持。

    在之前的五篇文章中对MongoDB.Repository框架做了简单的介绍是实现思路。之前是考虑MongoDB.Repository框架是可以同时支持多数据,且已实现支持多数据库。但有个前提:实体的类型不能重复,即一个实体类型(即命名空间一样)只能存在一个数据库中。举例,X实体,如果注册在了A数据库,那么将不能注册在B数据库中。

    虽然实现了该功能,但是存在一些问题和不足:

    问题:只有在使用具体的实例进行数据库操作时才会提示异常,且异常信息不清楚。

    不足:文件操作还未能支持多数据库,因为之前的版本对IMongoFile没有在IMongoDBContext上下文进行注册,所有的文件都会保存到一个数据库中。

    当然以上的问题,如果不需要支持多数据库,那么也就不存在这些问题。而在实际的设计中,却很难避免。比如我们如果要做一个简单的平台,出于安全、独立等因素,用户信息和应用信息应该是分开的数据库部署。

    本次修正内容:

    A:将实体注册放置在上下文注册之前,即在注册上下文之前,首先要检查该上下文中注册的实体是否已经被其它上下文注册过。

    B:IMongoFile的实体也需要在上下文中进行注册,不能对未注册的文件类型进行操作。并将MongoFile设置为abstract class,以保证注册流程。

    下面给出一个具体的注册案例:

        public class Company : Entity
        {    }
    
        public class Factory : Entity
        {  }
    
        public class CompanyDBContext : MongoDBContext
        {
            public CompanyDBContext() : base("CompanyDBContext") { }
            public override void OnRegisterModel(ITypeRegistration registration)
            {
                registration.RegisterType<Company>().RegisterType<Factory>();    //一次注册
            }
        }
    
        public class FactoryDBContext : MongoDBContext
        {
            public FactoryDBContext() : base("FactoryDBContext") { }
            public override void OnRegisterModel(ITypeRegistration registration)
            {
                registration.RegisterType<Factory>();    //二次注册
            }
        }
    
        //注册上下文
        MongoDBRepository.RegisterMongoDBContext(new CompanyDBContext());
        MongoDBRepository.RegisterMongoDBContext(new FactoryDBContext());    //因Factory进行了多次注册,在此会抛出类型多次注册异常
    

     如果需要使用文件,那么文件实体也一样需要注册,这在之前的版本并非强制,也存在一定的问题:

        public class MyFile : MongoFile
        {
            public MyFile()
                : base(@"c:	estxml.xml", "test.xml", "xml")
            { }
        }
    
        public class TestDBContext : MongoDBContext
        {
            public TestDBContext() : base("TestDBContext") { }
    
            public override void OnRegisterModel(ITypeRegistration registration)
            {
                registration.RegisterType<MyFile>();    //注册文件实体
            }
        }
    

     文件实体注册后,即可以使用,使用方式与其他实体无异:

                //加载本地文件,并实例一个IMongoFile
                IMongoFile file = MongoEntity.CreateFile<MyFile>(@"c:pic1.jpg", "pic2.jpg", "jpg");
    
                //下载文件,等同于文件另存为 
                file.Download(@"c:eforesave.jpg");
    
                //文件保存至数据库 
                file.Save();
    
                //从数据中加载刚才保存的文件
                IMongoFile fs = MongoEntity.LoadFile<MyFile>(file.Id);
    
                //将从数据中加载的文件下载
                fs.Download(@"c:aftersave.jpg");
    
                //根据数据库中的文件名检索文件
                var files = MongoEntity.LoadAllFiles<MyFile>("pic2.jpg");
    
                //根据文件id,将数据库中的文件下载到本地
                MongoEntity.DownloadFile<MyFile>(file.Id, @"c:copy.jpg");
    

     以上列出了一些文件的简单操作,并不是全部,每个方法也有不同程度的重载,并在以后根据实际使用情况会逐步的增加。

    欢迎大家下载DLL使用,并在使用过程中提出问题,共同改善,源码地址,分享快乐!

  • 相关阅读:
    mysql常用sql语句的练习笔记
    docker-compose使用--config启动mongodb出错的采坑记录
    ubuntu1804安装docker和docker-compose的最新2020详细教程
    ubuntu1804使用国内git源安装fastdfs的笔记
    2020最新nginx+gunicorn+supervisor部署基于flask开发的项目的生产环境的详细攻略
    2020年ubuntu1804安装php7.3最新详细教程
    2020年ubuntu1804安装nginx最新稳定版1.16详细教程笔记
    ubuntu1804python安装mysqlclient的模块报错的解决办法
    ubuntu1804开启mysql远程访问功能和设置root远程访问
    ubuntu1804使用python3 venv 创建虚拟目录和制定Pip国内安装源
  • 原文地址:https://www.cnblogs.com/winhu/p/3459353.html
Copyright © 2011-2022 走看看