主頁 > .NET開發 > 開箱即用簡單便捷的輕量級開源開發框架

開箱即用簡單便捷的輕量級開源開發框架

2020-09-23 20:34:54 .NET開發

  你是不是羨慕Java SpringBoot里功能強大的@注解功能,Spring Boot倡導是一種開箱即用、方便快捷、約定優于配置的開發流程,雖然現在.NET Core也往相同的方向走,但在使用上總有點別扭,目前市面上貌似還沒有輕量級的真正意義上的開箱即用的基于.NET Core的框架,

  想想多年前自己開發基于配置的DevFx開發框架,因為需要配置,造成開發人員苦不堪言,而且還容易配置錯誤,導致各種奇怪的錯誤;于是便有全新重寫DevFx框架的想法,經過N個月的奮戰,終于可以放出來用了,

  框架不求功能全面,只求使用方便、靈活,

  目前框架提供基于Attribute的IoC DI容器,完全可以面向介面編程了;提供輕量級的業務引數配置方案,未來計劃作為集中配置的基礎;提供極簡但不失靈活的資料訪問框架,類似mybatis基于sql的資料訪問;還有基于HTTP/JSON的遠程呼叫方案(以優雅的本地呼叫方式來遠程呼叫);主要是以上幾個功能,

  框架是基于.NET Standard 2.0開發,理論上.NET Framework 4.6.1也能使用,因為框架已完全重新重寫了,命名空間啥的都有改變,所以不兼容之前的版本,目前版本是5.0.2,

  OK,show me the code,下面讓我們來快速入門,看看怎么個開箱即用,

 

打開VS2019,建立基于.NET Core 2.2或3.0的控制臺專案ConsoleApp1,下面的例子是基于.NET Core 3.0的,使用NuGet安裝DevFx 5.0.2版本

 

 上圖,忽略DevFx.*,這是老舊版本,目前基于.NET Standard只有一個包,就是DevFx

創建業務邏輯介面和實作類

using DevFx;

namespace ConsoleApp1
{
    //業務邏輯介面,[Service]特性告訴DevFx這個介面需要被DI
    [Service]
    public interface IMyService
    {
        string GetUserName(string userId);
    }
}
using DevFx;
using System;

namespace ConsoleApp1
{
    //業務邏輯實作類,[Object]特性告訴DevFx這個類需要放入到IoC容器里,DevFx會掃描這個類實作了哪些介面,并做映射
    [Object]
    internal class MyService : IMyService
    {
        public string GetUserName(string userId) {
            return $"{userId}_{DateTime.Now.Ticks}";
        }
    }
}

開始呼叫邏輯

using DevFx;
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args) {
            //控制臺程式需要顯式呼叫框架的初始化方法
            //ASP.NET Core(通用主機)可以使用UseDevFx擴展方法來初始化框架
            ObjectService.Init();
            //獲取介面實作類的實體
            var myservice = ObjectService.GetObject<IMyService>();
            Console.WriteLine(myservice.GetUserName("IamDevFx"));
            //還能直接獲取MyService類的實體
            var myservice1 = ObjectService.GetObject<MyService>();
            //2種方式獲取的實體是同一個
            Console.WriteLine($" myservice={myservice.GetHashCode()}{Environment.NewLine}myservice1={myservice1.GetHashCode()}");
        }
    }
}

運行下:

 

 是不是很簡單?開箱即用!

 

接下介紹下自動裝配的例子

我們建立另外一個業務邏輯介面和相應的實作類,同樣分別標上[Service]和[Object]

using DevFx;

namespace ConsoleApp1
{
    [Service]
    public interface IBizService
    {
        string GetUserDisplayName(string userId);
    }

    [Object]
    internal class BizService : IBizService
    {
        public string GetUserDisplayName(string userId) {
            return "IamBizService";
        }
    }
}

改下之前的業務類MyService

using DevFx;
using System;

namespace ConsoleApp1
{
    //業務邏輯實作類,[Object]特性告訴DevFx這個類需要放入到IoC容器里,DevFx會掃描這個類實作了哪些介面,并做映射
    [Object]
    internal class MyService : IMyService
    {
        //自動裝配(注入)
        [Autowired]
        protected IBizService BizService { get; set; }

        public string GetUserName(string userId) {
            return $"{userId}_{DateTime.Now.Ticks}_{this.BizService.GetUserDisplayName(userId)}";
        }
    }
}

運行下:

 

接下來介紹下基于xml的配置,可能有些同學會問,.NET Core不是自帶配置了么?別急,看下我們的使用方式你就清楚誰便捷了,

業務引數指的比如微信的API介面地址、APPID等程式里需要使用的,或者一些開關之類的引數

首先定義需要承載業務引數的介面

using DevFx.Configuration;

namespace ConsoleApp1
{
    //定義需要承載業務引數的介面,[SettingObject("~/myservice/weixin")]告訴框架這是一個配置承載物件
    //    其中~/myservice/weixin為配置在組態檔里的路徑
    [SettingObject("~/myservice/weixin")]
    public interface IWeixinSetting
    {
        string ApiUrl { get; }
        string AppID { get; }
        string AppKey { get; }
    }
}

使用自動裝配特性,裝配到業務邏輯里,我們修改下MyService類

using DevFx;
using System;

namespace ConsoleApp1
{
    //業務邏輯實作類,[Object]特性告訴DevFx這個類需要放入到IoC容器里,DevFx會掃描這個類實作了哪些介面,并做映射
    [Object]
    internal class MyService : IMyService
    {
        //自動裝配(注入)
        [Autowired]
        protected IBizService BizService { get; set; }
        //配置自動注入
        [Autowired]
        protected IWeixinSetting WeixinSetting { get; set; }

        public string GetUserName(string userId) {
            return $"{userId}_{DateTime.Now.Ticks}_{this.BizService.GetUserDisplayName(userId)}_weixin={this.WeixinSetting.ApiUrl}";
        }
    }
}

在專案里添加app.config,并設定為有更新就輸出

 

app.config內容如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <devfx>
        <myservice>
            <weixin apiUrl="https://api.weixin.qq.com/sns/oauth2/access_token"
                    appId="1234567890" appKey="0123456789" />
        </myservice>
    </devfx>
</configuration>

運行下:

 

 

最后介紹下類似mybatis的資料訪問是如何開箱即用的,因為涉及到資料庫,稍微復雜些,但還是很方便的,

我們以操作MySql為例,首先需要使用NuGet安裝MySql驅動包,目前框架默認使用社區版的MySql驅動:MySqlConnector

 

定義我們的資料訪問層介面

using ConsoleApp1.Models;
using DevFx;
using DevFx.Data;

namespace ConsoleApp1.Data
{
    //定義資料操作介面,[DataService]告訴框架這是一個資料操作介面
    [DataService(GroupName = "MyService")]
    public interface IMyDataService : ISessionDataService
    {
        EventMessage GetEventMessageByID(string id);
    }
}

在專案中,添加一個.sqlconfig檔案,用來撰寫對應的Sql陳述句,并把這個檔案按嵌入資源形式設定

 

 sqlconfig內容如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <devfx>
        <data>
            <statements name="MyService">
                <add name="GetEventMessageByID">
                    <sql>
                        <![CDATA[SELECT * FROM EventMessages WHERE MessageGuid = @ID]]>
                    </sql>
                </add>
            </statements>
        </data>
    </devfx>
</configuration>

相信聰明的你能看出對應關系

然后就是在app.config里配置鏈接字串,如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <devfx>
        <data debug="true">
            <connectionStrings>
                <add name="EventMessageConnection" connectionString="Database=EventMessages;Data Source=資料庫IP;User ID=資料庫用戶;Password=密碼;Character Set=utf8" providerName="System.Data.MySqlClient" />
            </connectionStrings>
            <dataStorages defaultStorage="EventMessageStorage">
                <add name="EventMessageStorage" connectionName="EventMessageConnection" type="MySql" />
            </dataStorages>
        </data>

        <myservice>
            <weixin apiUrl="https://api.weixin.qq.com/sns/oauth2/access_token"
                    appId="1234567890" appKey="0123456789" />
        </myservice>
    </devfx>
</configuration>

調整下我們MySerivce類

using ConsoleApp1.Data;
using DevFx;
using System;

namespace ConsoleApp1
{
    //業務邏輯實作類,[Object]特性告訴DevFx這個類需要放入到IoC容器里,DevFx會掃描這個類實作了哪些介面,并做映射
    [Object]
    internal class MyService : IMyService
    {
        //自動裝配(注入)
        [Autowired]
        protected IBizService BizService { get; set; }
        //配置自動注入
        [Autowired]
        protected IWeixinSetting WeixinSetting { get; set; }
        //資料訪問介面自動注入
        [Autowired]
        protected IMyDataService MyDataService { get; set; }

        public string GetUserName(string userId) {
            var msg = this.MyDataService.GetEventMessageByID("0000e69f407a4b69bbf3866a499a2eb6");
            var str = $"EventMessage:{msg.MessageGuid}_{msg.Category}_{msg.Priority}_{msg.CreatedTime}";
            return $"{userId}_{DateTime.Now.Ticks}_{this.BizService.GetUserDisplayName(userId)}_weixin={this.WeixinSetting.ApiUrl}{Environment.NewLine}{str}";
        }
    }
}

運行下:

 當然資料訪問不僅僅是查詢,還應該有CRUD、分頁以及事務才完整,這些后續會詳細展開,

 

OK,上面就是這些核心功能的展示,另外框架還支持自定義Attribute的處理方便自行擴展,

后續會比較詳細介紹實作原理以及對框架的拓展,比如服務注冊發現、配置中心等等,

有興趣的同學可以一起共同討論維護,專案開源地址在:https://github.com/mer2/devfx

碼字不容易啊,感興趣的可以去star下,

示例代碼在此:https://files.cnblogs.com/files/R2/ConsoleApp1.zip

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/114293.html

標籤:.NET Core

上一篇:ASP.NET Core 3.0 原生DI拓展實作IocManager

下一篇:.NET Core簡介

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more