我的權限系統設計實現MVC4 + WebAPI + EasyUI + Knockout(五)框架及Web項目的組件化


一、組件化印象

1、先給大家看一張截圖

image

如果我告訴大家,這就是一個web管理系統發布后的所有內容,你們會不會覺得太簡潔了,只有一個web.config、一個Global.asax文件,其它的都是dll文件,沒有aspx、cshtml、html頁面,沒有js css images文件,但它的確能跑起來,跑起來之后的截圖如下

image

2、再看我新建一個項目的流程

新建一個ASP.NET MVC 4的空的項目

image

image

點確定之后,創建項目,默認的項目目錄結構如下

image

然后打開nuget包管理界面,選擇我們需要安裝的組件 Zephyr.Web.Sys,這是我們權限管理系統

image

點安裝進行安裝,實現上就是引入dll文件

image

安裝完成后,直接F5運行,就出現了以下頁面

image

點創建后

image

我們選擇MySql輸入相應的數據庫信息測試連接通過后,點創建

image

創建成功

image

現在登錄跳轉到登陸頁面

image

登錄成功后

image

權限系統中頁面測試都沒有問題

image

然后我們回過頭看程序,什么都沒改變,

image

只是增加了一些引用及web.config中添加了一些信息。

image

那回過頭來,這樣發布后,不就是我們之前所看到了什么都沒有的Web應用程序了

image

大家是不是也是很感興趣,我當時也只是一個想法,但直正驅動我去完成這些功能的還是以下幾點:

a 代碼的重用性提高,可以很方便的用NuGet管理類庫或系統。即使不用NuGet管理,直接把dll文件拷貝到新建項目的bin下面,然后修改下web.config也是可以的。比以前我們引用項目的方式方便很多。

b 創建一個新項目時只需要安裝組件即可

c 發布后的程序干凈,項目更新只需覆蓋對應的dll即可。

d 更方便做成產品發布

 

二、NuGet操作

那么我們要做到前面所看到的,我們要做哪些工作?

1、准備好要組件化的的類庫

image

2、創建Nuget包

創建NuGet包有很多種方法,我采用的是編譯時自動生成NuGet包,

首先要啟用NuGet包還原功能(Eable NuGet Package Restore),然后VS會自動下載添加一個.nuget的文件夾

image

然后編輯項目工程文件,添加最后一行<BuildPackage>true</BuildPackage>

image

然后編譯后就會在bin目錄下發現一個后綴為nupkg的文件,這就是我們要的nuget包

image

當然你也可以在程序包管理器控制台輸入命令行進行打包
也可以下載一個圖形化的打包器nuget package explorer

3、推送到NuGet服務上

你可以在https://www.nuget.org/注冊上帳號,放在nuget官網上
也可以自己搭建一個NuGet服務器:新建一個空項目,安裝NuGet.Server然后直接發布就可以了。具體教程網上也很多了。

上傳NuGet包只需要執行以下命令
nuget push Zephyr.Core.2.0.0.0.nupkg -s http://192.168.1.100:8888

到這里就已經ok了,你可以在Nuget包管理界面中添加一個程序包源服務地址,然后就可以安裝你剛剛上傳的包了

 

三、打包Web應用會碰到的問題

1、資源的嵌入

資源的嵌入分兩種,一種是靜態資源,直接內嵌到程序集中
第二種是動態的頁面,可以預編譯成類放到程序集中

image

 

2、資源的訪問

獲取嵌入資源的訪問地址

public static string GetResourceUrl(Type type string embedFileName)
{
var page = new Page(); return page.ClientScript.GetWebResourceUrl(type, embedFileName); }

當然你也可以通過controller去處理

[AllowAnonymous]
[MvcMenuFilter(false)]
[WebFrameworkFilter]
public class ResourceController : Controller
{
    public ActionResult Index()
    {
        var assemblyName = ResourceVirtualPathProvider.ResourceVirtualPath.GetAssemblyName(Request.Path);
        var filename = ResourceVirtualPathProvider.ResourceVirtualPath.GetResourceName(Request.Path);
        var assembly = ReflectionHelper.GetAssembly(assemblyName);

        var stream = ResourceHelper.GetFileStream(assembly,filename);
        var contentType = ResourceHelper.GetContentType(filename);

        if (stream == null)
            return HttpNotFound();

        return File(stream, contentType);
    }
}

四、框架組件化操作

我的框架Zephyr.Net主要分為:

類庫 描述 依賴
Zephyr.Utils 工具類庫  
Zephyr.Library 常用其它類庫  
Zephyr.Data 數據庫訪問組件  
Zephyr.Core 框架核心類 Zephyr.Utils Zephyr.Library Zephyr.Data
Zephyr.Web.Resource 靜態資源  
Zephyr.Web.Mvc 縱雲Mvc框架 Zephyr.Core
Zephyr.Web.Sys 權限管理系統 Zephyr.Web.Mvc

以上是七個獨立的項目,依賴關系也不直接引用項目,而是從nuget上引用發布程序包,

其中前面四個是類庫
Zephyr.Web.Resource是嵌入靜態資源的程序集,如果不引入這個文件,直接把靜態資源文件夾拷貝進項目中也是可以的。
Zephyr.Web.Mvc是我們的Mvc框架基礎,已經包括了mvc及web api很多的路由注冊過濾器設定等設置,並且有Login頁面和Index頁面,安裝了這個組件,即使不安裝縱雲權限系統組件,程序也一樣可以跑起來,只是沒有權限系統,是個空的架子。
Zephyr.Web.Sys就是權限系統了,把權限系統的mvc及webapi控制器、View頁面、js以及數據庫初始化處理都放在這個程序集中。
以后我們開發新的項目也可以做成跟這個權限系統一樣,都放在一個dll中(當然也可以分多個,把controller model等都分成不同的層),以后只要引入或者bin下面放入這個dll就會動態引入這個模塊,非常方便。

打包成nuget packages發布到nuget服務上,大功就告成了,如果有更新,只需要更新版本號重新發布就行了

image

這樣一來,基本就把我的框架以及權限系統都做成組件了,如果新項目需要引入,或者多個項目升級都很方便了。

.NET框架交流群(三)  21549700


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM