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

LindDotNetCore~基於模組化注入的介紹

回到目錄

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);
}

待續...
回到目錄