LindDotNetCore~基於模組化注入的介紹
LindDotNetCore相關介紹
相關模組
- 全域性都是依賴DI
- 訊息佇列
- NoSql
- Caching
- 倉儲
- 服務匯流排
- Solr
- 排程
- 日誌
- Asspect攔截元件
- UAA授權
- 各種元件環境的搭建
各模組單元測試編寫
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);
}
待續...
回到目錄