MongoDB:利用官方驅動改裝爲EF代碼風格的MongoDB.Repository框架 六:支持多數據庫操做

本次主要內容:修正MongoDB.Repository框架對多數據庫的支持。

在以前的五篇文章中對MongoDB.Repository框架作了簡單的介紹是實現思路。以前是考慮MongoDB.Repository框架是能夠同時支持多數據,且已實現支持多數據庫。但有個前提:實體的類型不能重複,即一個實體類型(即命名空間同樣)只能存在一個數據庫中。舉例,X實體,若是註冊在了A數據庫,那麼將不能註冊在B數據庫中。git

雖然實現了該功能,可是存在一些問題和不足:github

問題:只有在使用具體的實例進行數據庫操做時纔會提示異常,且異常信息不清楚。數據庫

不足:文件操做還未能支持多數據庫,由於以前的版本對IMongoFile沒有在IMongoDBContext上下文進行註冊,全部的文件都會保存到一個數據庫中。安全

固然以上的問題,若是不須要支持多數據庫,那麼也就不存在這些問題。而在實際的設計中,卻很難避免。好比咱們若是要作一個簡單的平臺,出於安全、獨立等因素,用戶信息和應用信息應該是分開的數據庫部署。框架

本次修正內容:ide

A:將實體註冊放置在上下文註冊以前,即在註冊上下文以前,首先要檢查該上下文中註冊的實體是否已經被其它上下文註冊過。spa

B:IMongoFile的實體也須要在上下文中進行註冊,不能對未註冊的文件類型進行操做。並將MongoFile設置爲abstract class,以保證註冊流程。設計

下面給出一個具體的註冊案例:xml

    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進行了屢次註冊,在此會拋出類型屢次註冊異常

 若是須要使用文件,那麼文件實體也同樣須要註冊,這在以前的版本並不是強制,也存在必定的問題:blog

    public class MyFile : MongoFile
    {
        public MyFile()
            : base(@"c:\testxml.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:\beforesave.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使用,並在使用過程當中提出問題,共同改善,源碼地址,分享快樂!

相關文章
相關標籤/搜索