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

回到目錄html

LindDotNetCore相關介紹

相關模塊

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

DI統一戰線

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

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'實現的,用來解耦項目,處理高併發任務和耗時任務,生產者
不須要關心是誰來消費,它只管把消息發到隊列中;而消費者不關心消息如何產生,只把消費按着
業務邏輯去處理掉!mysql

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用來存儲文檔
型數據,支持複雜的查詢,嵌套查詢等。linux

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等數據庫。redis

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

服務總線

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

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

Solr

Solr是在Lucene基礎以前開發的,使用java編寫,通常部署在tomcat上,有本身的圖像管理界面,能夠用來管理core,
通常地,咱們在設計一個core時,須要爲它創建對應的實體,與它的core裏的屬性對應起來;solr有豐富的插件,像一些
中文分詞包,索引包等。mongodb

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來實現。c#

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

待續...
回到目錄

相關文章
相關標籤/搜索