ASP.NET Core
本文檔描述了ABP如何集成ASP.NET Core。ASP.NET Core通過Abp.AspNetCore nuget包實現集成。
如果你已經有一個工程並考慮遷移到ASP.NET Core,你可以閱讀我們博客的帖子來了解我們遷移的經驗。
你可以在啟動模板創建一個工程,這是一個簡單、空的web工程但是已經和ABP框架集成並進行了適當的配置。
為了使ABP集成到ASP.NET Core,我們需要在Startup類里做一些更改,如下所示:
public class Startup { public IServiceProvider ConfigureServices(IServiceCollection services) { //... //Configure Abp and Dependency Injection. Should be called last. return services.AddAbp<MyProjectWebModule>(options => { //Configure Log4Net logging (optional) options.IocManager.IocContainer.AddFacility<LoggingFacility>( f => f.UseLog4Net().WithConfig("log4net.config") ); }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { //Initializes ABP framework and all modules. Should be called first. app.UseAbp(); //... } }
你可以使用啟動配置來配置AspNet Core模塊(在模塊的PreInitialize方法中使用Configuration.Modules.AbpAspNetCore())。
在ASP.NET Core中控制器可以是任何類型的類。它不僅限制於繼承自Controller的類。一個類以Controller(如ProductController)結尾就默認為MVC控制器。你也可以給任何類添加MVC的[Controller]特性使其成為一個控制器。這就是ASP.NET Core MVC工作的方式。參見ASP.NET Core文檔了解更多。
如果你使用web層的類(如HttpContext)或返回一個視圖,最好繼承AbpController(它從MVC的Controller繼承)類。但是,如果你創建的API控制器僅僅使用對象,可以考慮創建一個POCO控制器類或者你可以按如下所描述的那樣使用應用服務作為控制器。
ABP提供了基礎設施來創建應用服務。如果你想將應用服務作為控制器提供給遠程客戶端(可以像之前一樣使用dynamic web api),你可以在模塊的PreInitialize方法中通過一個簡單配置來實現。示例:
Configuration.Modules.AbpAspNetCore().CreateControllersForAppServices(typeof(MyApplicationModule).Assembly, moduleName: 'app', useConventionalHttpVerbs: true);
CreateControllersForAppServices 方法接收一個程序集,把程序集里所有的應用服務轉換為MVC控制器。你可以使用RemoteService特性在方法或類級別來啟用/禁用它。
當一個應用服務轉換為MVC控制器,默認路由為/api/services/<module-name>/<service-name>/<method-name>。例如:如果ProductAppService定義了一個Create方法,它的URL將為/api/services/app/product/create(假定模塊的名字為'app')。
如果useConventionalHttpVerbs設置為true(默認值為true),那么服務方法的HTTP動詞由命名約定來決定:
- Get:方法名以'Get'開始時使用。
- Put:方法名以'Put'或'Update'開始時使用。
- Delete:方法名以'Delete'或'Remove'開始時使用。
- Post:方法名以'Post','Create'或'Insert'開始時使用。
- Patch:方法名以'Patch'開始時使用。
- 否則,Post為默認使用的HTTP動詞。
你可以使用任何ASP.NET Core特性來改變HTTP方法或actions的路由(但是當然這需要添加相關ASP.NET Core包的引用)。
注意:之前,在給應用服務創建服務接口時需要動態wei api系統,但是對於ASP.NET Core集成不需要。同樣,MVC特性應該添加到服務類,即使已經有接口。
ABP為AspNet Core 定義了一些內建過濾器。默認所有的過濾器會添加到所有控制器的所有actions。
AbpAuthorizationFilter用來集成授權系統和特征系統。
- 你可以為actions或controllers定義AbpMvcAuthorize特性來在執行前檢查需求的權限。
- 你可以為actions或controllers定義RequiresFeature特性來在執行前檢查需求的特征。
- 你可以為actions或controllers定義AllowAnonymous(或在應用層定義AbpAllowAnoymous)特性來禁止校驗和授權。
AbpAuditActionFilter用來集成審計日志系統。它默認為所有的actions記錄所有的請求(如果審計沒有禁用)。你可以為actions和controllers使用Audited和DisableAuditing特性來控制審計日志。
AbpValidationActionFilter用來集成校驗系統並自動為所有的actions校驗輸入。另外ABP內建校驗和標准化,它檢查MVC的Model.IsValid屬性並拋出校驗異常,如果action的輸入有任何無效值。
你可以為actions和controllers使用EnableValidation和DisableValidation特性來控制校驗。
AbpUowActionFilter用來集成工作單元系統。它在action執行前自動開始一個新的工作單元並在action結束后完成工作單元(如果沒有異常拋出)。
你可以使用UnitOfWork特性來控制action的UOW行為。你也可以使用啟動配置來更改所有action的默認工作單元特性。
AbpExceptionFilter用來從controller actions中處理異常拋出。它處理並記錄異常,然后返回包裝的響應到客戶端:
- 它僅處理對象結果,不處理視圖結果。所以,actions返回任何對象、JsonResult或者ObjectResult都會被處理。Action返回一個視圖或任何其他實現了IActionsResult的結果類型不會被處理。建議使用在Microsoft.AspNetCore.Diagonistics包中內建的UseExceptionHandler擴展方法來處理視圖異常。
- 異常處理和日志行為可以為方法或類使用WrapResult和DontWrapResult特性來改變。
AbpResultFilter主要用來包裝結果action,如果action執行成功的話。
- 它僅包裝JsonResult、OjectResult和任何沒有實現IActionResult(還有相應的異步版本)的對象。如果你的action返回一個視圖或任何其他類型的結果,都不會被包裝。
- WrapResult和DontWrapResult特性可以用於方法和類來啟用/禁用包裝。
- 你可以使用啟動配置來更改結果包裝的默認行為。
AbpResultFilter為AJAX請求的響應添加了Cache-Control頭(no-cache,no-store)。因此,它阻止瀏覽器緩存AJAX響應甚至GET請求的響應。可以使用配置來禁用此功能。
AbpDateTimeModelBinder用來標准化DateTime(和Nullable<DateTime>)輸入,使用Clock.Normalize方法。
MVC視圖可以繼承自AbpRazorPage來自動注入大多數使用的基礎設施(LocalizationManager、PermissionChecker、SettingManager...etc)。它也有快捷方法(如L(...)來本地化文本)。啟動模板默認繼承它。
你可以使你的web組件繼承自AbpViewComponet而不是ViewComponent來使用基礎屬性和方法的優勢。
ABP可以自動為所有的MVC控制器(不僅僅是應用服務)創建javascript代理。它默認創建應用服務作為控制器(參見上面部分)。你可以為任何MVC控制器添加[RemoteService]特性來為它創建客戶端代理。Javascript代理在運行時動態生成。你需要在page中添加指定的script定義:
<script src="~/AbpServiceProxies/GetAll?type=jquery" type="text/javascript"></script>
當前,只有JQuery代理生成。然后我們可以使用javascript來調用一個MVC方法,如下所示:
abp.services.app.product.create({ name: 'My test product', price: 99 }).done(function(result){ //... });
對於ASP.NET Core而言,集成測試相當容易,它自己的網站上有詳細的文檔。ABP跟隨這個導向並在Abp.AspNetCore.TestBase包中提供了AbpAspNetCoreIntegratedTestBase類。它使得集成測試更加簡單。
最好在啟動模板里探究集成測試。