1. 程式人生 > >LindDotNetCore~基於模塊化註入的介紹

LindDotNetCore~基於模塊化註入的介紹

fse runtime conf 相關 大數據 add obj enable sqllite

LindDotNetCore相關介紹

相關模塊

  1. 全局都是依賴DI
  2. 消息隊列
  3. NoSql
  4. Caching
  5. 倉儲
  6. 服務總線
  7. Solr
  8. 調度
  9. 日誌
  10. Asspect攔截組件
  11. UAA授權
  12. 各種組件環境的搭建
  13. 各模塊單元測試編寫

    DI統一戰線

    LindDotNet框架同樣采用了全局DI註入的方式來使用模塊對象的,這種松耦合的設計對於單元測試
    是很方便人。

    services.AddLog4Logger(o =>
    {
    o.Log4ConfigFileName = "log4.config";
    o.ProjectName = "test";
    });
    services.UseDapper(o =>
    {
    o.ConnString = $"Data Source=/Data/intergratetest.db";
    o.DbType = Lind.DotNetCore.Repository.DbType.SqlLite;
    });

    消息隊列

    消息隊列主要使用‘rabbitmq,kafka‘實現的,用來解耦項目,處理高並發任務和耗時任務,生產者
    不需要關心是誰來消費,它只管把消息發到隊列中;而消費者不關心消息如何產生,只把消費按著
    業務邏輯去處理掉!

    services.AddRabbitMQ(o =>
    {
    o.ExchangeName = "zzl";
    o.MqServerHost = "192.168.200.214";
    o.VirtualHost = "/";
    o.ExchangeType = "topic";
    });

    NoSql

    目前框架的NoSql部分由redis和mongodb

    組成,之所有選擇這兩種框架最大的原因就是它們覆蓋了
    NoSql所有的使用場景,像redis用來存儲k/v鍵值對,支持5大數據結構;而mongodb用來存儲文檔
    型數據,支持復雜的查詢,嵌套查詢等。

    services.AddRedis(o =>
    {
    o.Host = "localhost:6379";
    o.AuthPassword = "";
    o.IsSentinel = 1;
    o.ServiceName = "mymaster";
    o.Proxy = 0;
    });

    Caching

    數據緩存是比較重要的部分,用來存儲一些熱數據,目前分布式環境使用redis,單機可以直接使用

    運行時緩存。

    services.AddRuntimeCache(o =>
    {
    o.CacheKey = "lindCache";
    o.ExpireMinutes = 5;
    });

    倉儲

    倉儲主要簡化數據持久化的操作,對外提供簡單的CURD操作接口,使用者直接調用即可,不需要幹預SQL語句,
    從這點上來說,開發效率確實提升了不少。目前大叔框架裏集成了ef,dapper,mongodb,redis,elastic等倉儲,其中
    EF和Dapper可以操作sqlserver,mysql,sqllite等數據庫。

    services.UseDapper(o =>
    {
    o.ConnString = $"Data Source={Directory.GetCurrentDirectory()}/intergratetest.db";
    o.DbType = Lind.DotNetCore.Repository.DbType.SqlLite;
    });

    服務總線

    服務總線主要是用來解耦項目的層與層之間的調用,讓程序員把關註點放在業務上,目前框架提供了IOC模式的事件,
    基於簡單內存字典存儲的事件等。

    services.AddIocBus();
    services.AddInMemoryBus();

    Solr

    Solr是在Lucene基礎之前開發的,使用java編寫,一般部署在tomcat上,有自己的圖像管理界面,可以用來管理core,
    一般地,我們在設計一個core時,需要為它建立對應的實體,與它的core裏的屬性對應起來;solr有豐富的插件,像一些
    中文分詞包,索引包等。

    services.AddSolrNet(o =>
    {
    o.ServerUrl = "http://192.168.200.214:8081/solr/system_companysubject";
    o.UserName = "sa";
    o.Password = "sa";
    });

    調度服務

    調度服務是以quartz為核心,並對它的功能進行了封裝,支持實時添加的任務,這一點使用了windows/linux的目錄監控事件
    ,也是.netcore幫我們實現的,我們只需要訂閱相關事件即可。

    var watcher = new FileSystemWatcher
    {
    Path = AppDomain.CurrentDomain.BaseDirectory,
    NotifyFilter = NotifyFilters.Attributes |
                   NotifyFilters.CreationTime |
                   NotifyFilters.DirectoryName |
                   NotifyFilters.FileName |
                   NotifyFilters.LastAccess |
                   NotifyFilters.LastWrite |
                   NotifyFilters.Security |
                   NotifyFilters.Size,
    Filter = "*.dll"
    };
    // quartz運行時,可以添加新job,但不能覆蓋,刪除等
    watcher.Created += new FileSystemEventHandler((o, e) =>
    {
    foreach (var module in Assembly.LoadFile(e.FullPath).GetModules())
    {
        foreach (var type in module.GetTypes().Where(i => typeof(ISchedulingJob).IsAssignableFrom(i)))
        {
            JoinToQuartz(type, DateTimeOffset.Now);
        }
    }
    });
    //Start monitoring.
    watcher.EnableRaisingEvents = true;

    日誌

    日誌框架與之前的Lind框架裏日誌差別不大,只是把對象的生命周期移到了DI容器去統一管理,都采用單例方式,目前日誌框架提供了
    對log4net的支持,同時輕量級日誌可以使用lindlogger來實現。

    services.AddLog4Logger(o =>
    {
    o.Log4ConfigFileName = "log4.config";
    o.ProjectName = "test";
    });

    Asspect攔截組件

    方法攔截在微軟mvc,api框架裏應用十分廣泛,可以在方法執行前與執行後動態添加一切邏輯,而不需要關註方法細節,實現攔截行為
    的開發人員不需要去關註方法細節,這利用了面向對象的封裝特性,而也符合開閉原則,因為你可以在不修改原來代碼的情況下,動態
    為它添加行為。

    [Fact]
    public void FuncInvoke()
    {
    var obj = ProxyFactory.CreateProxy<AspectTest, AspectTest>();
    Assert.Equal("OK", obj.GetHello());
    }
    [Fact]
    public void ActionInvoke()
    {
    var obj = ProxyFactory.CreateProxy<AspectTest, AspectTest>();
    obj.SetHello();
    Assert.Equal(1, 1);
    }

    待續...

LindDotNetCore~基於模塊化註入的介紹