天天看點

最新.NET Core面試題彙總

對于還沒有學習.NET Core,或正在學習,也可以對照一下自己,掌握的熟練程度!

這幾天給.neter們整理了26道.NET Core面試題,初衷也很簡單,就是希望在面試的時候能夠幫助到大家,減輕大家的負擔和節省時間。對于沒有跳槽打算的也可以複習一下相關知識點,就當是查缺補漏!

1.如何在controller中注入service?

在config services方法中配置這個service。

在controller的構造函數中,添加這個依賴注入。

2.談一談對DDD的了解?

DDD,領域驅動設計。就是通過領域來指導軟體設計,是一種十分抽象的軟體設計思想,它主要分為戰略設計和戰術設計

戰略方面,通過事件風暴進行領域模型的劃分,劃分出核心域,子域,支撐域,定義通用語言,劃分出界限上下文。

在戰術設計方面,ddd将架構分層,“松耦合,高内聚”是架構設計的整體思想。按照DDD思想,可以分為領域層,基礎設施層,應用層,接口層。

接口層為前端使用者提供api接口。基礎設施層可以放一些第三方的服務,資料庫連接配接等内容。應用層是對領域服務的編排,是很薄的一層(目前我自己的架構,應用的是cqrs,所有的相關邏輯都是放在了應用層,而領域層隻是放了實體,因為暫時還不是特别了解領域層的服務和事件都應該寫什麼)。領域層包括實體,值對象,聚合根,領域服務,領域事件等内容。

3.ASP.NET Core 比 ASP.NET 更具優勢的地方是什麼?

跨平台,ASP.NET Core 可以運作在 Windows 、Linux 和 MAC 系統上;

對架構本安裝沒有依賴,所有依賴都跟程式本身在一起;

ASP.NET Core 處理請求的效率更高,進而可以處理更多的請求;

ASP.NET Core 具有更多的安裝配置方法。

4.asp.net core 主要的特性有哪些?

依賴注入。

日志系統架構。

引入了一個跨平台的網絡伺服器,kestrel。可以沒有iis, apache和nginx就可以單獨運作。

可以使用指令行建立應用。

使用AppSettings.json 來配置工程。

使用start up來注冊服務。

更好的支援異步程式設計。

支援web socket和signal IR。

對于跨網站的請求的預防和保護機制。

5.ASP.NET Core Filter如何支援依賴注入?

可以通過全局注冊,支援依賴注入

通過TypeFilter(typeof(Filter)) 标記在方法,标記在控制器

通過ServiceType(typeof(Filter))标記在方法,标記在控制器,必須要注冊Filter這類;

TypeFilter和ServiceType的本質是實作了一個IFilterFactory接口;

6. Asp.Net Core中有哪些異常處理的方案?

1.繼承Controller,重寫OnActionExecuted

預設都會繼承一個Controller類,重寫OnActionExecuted,添加上異常處理即可。一般情況下我們會建立一個BaseController, 讓所有Controller繼承BaseController。代碼如下

public class BaseController : Controller
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        var exception = context.Exception;
        if (exception != null)
        {
            context.ExceptionHandled = true;
            context.Result = new ContentResult
            {
                Content = $"BaseController錯誤 : { exception.Message }"
            };
        }
        base.OnActionExecuted(context);
    }
}
           

2.使用 ActionFilterAttribute。

ActionFilterAttribute是一個特性,本身實作了 IActionFilter 及 IResultFilter , 是以不管是action裡抛錯,還是view裡抛錯,理論上都可以捕獲。我們建立一個 ExceptionActionFilterAttribute, 重寫 OnActionExecuted及OnResultExecuted,添加上異常處理,完整代碼如下:

public class ExceptionActionFilterAttribute:ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        var exception = context.Exception;
        if (exception != null)
        {
            context.ExceptionHandled = true;
            context.Result = new ContentResult
            {
                Content = $"錯誤 : { exception.Message }"
            };
        }
        base.OnActionExecuted(context);
    }

    public override void OnResultExecuted(ResultExecutedContext context)
    {
        var exception = context.Exception;
        if (exception != null)
        {
            context.ExceptionHandled = true;
            context.HttpContext.Response.WriteAsync($"錯誤 : {exception.Message}");
        }
        base.OnResultExecuted(context);
    }
}
           

使用方式有兩種,

在controller裡打上 [TypeFilter(typeof(ExceptionActionFilter)] 标簽;

在Startup裡以filter方式全局注入。

services.AddControllersWithViews(options =>
{
    options.Filters.Add<ExceptionActionFilterAttribute>();
})
           

3.使用 IExceptionFilter

我們知道, Asp.Net Core提供了5類filter, IExceptionFilter是其中之一,顧名思義,這就是用來處理異常的。Asp.net Core中ExceptionFilterAttribute已經實作了IExceptionFilter,是以我們隻需繼承ExceptionFilterAttribute,重寫其中方法即可。 同樣建立CustomExceptionFilterAttribute繼承 ExceptionFilterAttribute,重寫 OnException ,添加異常處理,完整代碼如下:

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        context.ExceptionHandled = true;
        context.HttpContext.Response.WriteAsync($"CustomExceptionFilterAttribute錯誤:{context.Exception.Message}");
        base.OnException(context);
    }
}
           

4.使用ExceptionHandler.

在 startup 裡,vs建立的項目會預設加上.

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
}
           

5.自定義Middleare處理

通過middleware全局處理。

public class ErrorHandlingMiddleware
{
   private readonly RequestDelegate next;

   public ErrorHandlingMiddleware(RequestDelegate next)
   {
        this.next = next;
   }

   public async Task Invoke(HttpContext context)
   {
        try
        {
           await next(context);
        }
        catch (System.Exception ex)
        {
           //處理異常
        }
   }
}
           

7.介紹ASP.NET Core中服務的生命周期?

ASP.NET Core支援依賴注入軟體設計模式,它允許在不同的元件中注入我們的服務,并且控制服務的初始化。有些服務可以在短時間内初始化,并且隻能在某個特别的元件,以及請求中才能用到;而還有一些服務,僅僅隻用初始化一次,就可以在整個應用程式中使用。

Singleton --單例模式:

隻有一個服務的執行個體被建立,這個執行個體,存儲在記憶體中,可以在整個應用程式中使用。我們可以對一些初始化代價比較大的服務,使用Singleton模式。在代碼中可以這樣:

services.AddSingleton<IProductService, ProductService>();
           

Scoped --作用域

這種模式下,将會為每一個請求,都建立一個服務的執行個體。所有同一個請求中的中間件、MVC控制器,等等,都會得到一個相同的服務執行個體。Entity Framework Context就是一個Scoped服務最好的參考例子。我們可以通過使用AddScoped方法來使用Scoped模式:

services.AddScoped<IProductService, ProductService>();
           

Transient --短暫的、瞬變的  

Transient模式下,服務每次被請求的時候,都會建立一個服務執行個體,這種模式特别适合輕量級、無狀态的服務。我們可以使用AddTransient方法,來注入服務:

services.AddTransient<IProductService, ProductService>();
           

8.什麼是依賴注入?

依賴注入是一個過程,就是當一個類需要調用另一個類來完成某項任務的時候,在調用類裡面不要去new被調用的類的對象,而是通過注入的方式來擷取這樣一個對象。具體的實作就是在調用類裡面有一個被調用類的接口,然後通過調用接口的函數來完成任務。比如A調用B,而B實作了接口C,那麼在A裡面用C定義一個變量D,這個變量的執行個體不在A裡面建立,而是通過A的上下文來擷取。這樣做的好處就是将類A和B分開了,他們之間靠接口C來聯系,進而實作對接口程式設計。

9.依賴注入有哪幾種方式?

setter注入:

就是在類A裡面定義一個C接口的屬性D,在A的上下文通過B執行個體化一個對象,然後将這個對象指派給屬性D。主要就是set 與 get

構造函數注入:

就是在建立A的對象的時候,通過參數将B的對象傳入到A中。

還有常用的注入方式就是工廠模式的應用了,這些都可以将B的執行個體化放到A外面,進而讓A和B沒有關系。還有一個接口注入,就是在客戶類(A)的接口中有一個服務類(B)的屬性。在執行個體化了這個接口的子類後,對這個屬性指派,這和setter注入一樣。

接口注入

相比構造函數注入和屬性注入,接口注入顯得有些複雜,使用也不常見。具體思路是先定義一個接口,包含一個設定依賴的方法。然後依賴類,繼承并實作這個接口。

10.控制反轉是什麼?

控制反轉(Inversion of Control,縮寫為IoC),是面向對象程式設計中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。

通過控制反轉,對象在被建立的時候,由一個調控系統内所有對象的外界實體将其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。

11.依賴注入有哪些著名的架構?

Unity、autofac、http://spring.net、MEF、Injection、Asp.Net Core的ServiceCollection。

12.介紹一些ABP.NEXT?

ASP.NET Boilerplate是.Net平台非常優秀的一個開源Web應用程式架構,在國内也有大量的粉絲.

從名稱可以看出來, 這是ASP.NET Boilerplate的下一代架構。

ABP架構創作于2013年,那時候沒有.Net Core和ASP.NET Core,也沒有Angular2 +。ABP釋出後,它們都是從頭開發的。

ASP.NET Core引入了許多内置解決方案(擴充庫),用于依賴注入,日志記錄,緩存,本地化,配置等。它們實際上獨立于ASP.NET Core,可用于任何類型的應用程式。

13.什麼是dot net core的startup class?

Startup class是dot net core應用的入口。所有的dot net core應用必須有這個class。這個類用來配置應用。這個類的調用是在program main函數裡面進行配置的。類的名字可以自己定義。

14.startup class的configure方法有什麼作用?

這個方法來定義整個應用如何響應HTTP請求。它有幾個比較重要的參數,application builder,Hosting environment, logo factory, 在這裡我們可以配置一些中間件用來處理路徑,驗證和session等等。

15.什麼是中間件(Middleware)?

中間件是組裝到應用程式管道中以處理請求和響應的軟體。 每個元件:

選擇是否将請求傳遞給管道中的下一個元件。

可以在調用管道中的下一個元件之前和之後執行工作。

請求委托(Request delegates)用于建構請求管道,處理每個HTTP請求。

請求委托使用Run,Map和Use擴充方法進行配置。單獨的請求委托可以以内聯匿名方法(稱為内聯中間件)指定,或者可以在可重用的類中定義它。這些可重用的類和内聯匿名方法是中間件或中間件元件。請求流程中的每個中間件元件都負責調用流水線中的下一個元件,如果适當,則負責連結短路。

16.中間件的使用場景有哪些?

份驗證,Session存儲,日志記錄等。其實我們的Asp.net core項目中本身已經包含了很多個中間件。比如 身份認證中間件 UseAuthorization()等系列

17.列舉官方常用的中間件?

異常/錯誤處理 當應用在開發環境中運作時: 開發人員異常頁中間件 (UseDeveloperExceptionPage) 報告應用運作時錯誤。 資料庫錯誤頁中間件報告資料庫運作時錯誤。 當應用在生産環境中運作時: 異常處理程式中間件 (UseExceptionHandler) 捕獲以下中間件中引發的異常。 HTTP 嚴格傳輸安全協定 (HSTS) 中間件 (UseHsts) 添加 Strict-Transport-Security 标頭。

HTTPS 重定向中間件 (UseHttpsRedirection) 将 HTTP 請求重定向到 HTTPS。

靜态檔案中間件 (UseStaticFiles) 傳回靜态檔案,并簡化進一步請求處理。

Cookie 政策中間件 (UseCookiePolicy) 使應用符合歐盟一般資料保護條例 (GDPR) 規定。

用于路由請求的路由中間件 (UseRouting)。

身份驗證中間件 (UseAuthentication) 嘗試對使用者進行身份驗證,然後才會允許使用者通路安全資源。

用于授權使用者通路安全資源的授權中間件 (UseAuthorization)。

會話中間件 (UseSession) 建立和維護會話狀态。 如果應用使用會話狀态,請在 Cookie 政策中間件之後和 MVC 中間件之前調用會話中間件。

用于将 Razor Pages 終結點添加到請求管道的終結點路由中間件(帶有 MapRazorPages 的 UseEndpoints)。

18.中間件的執行順序?

異常/錯誤處理

HTTP 嚴格傳輸安全協定

HTTPS 重定向

靜态檔案伺服器

Cookie 政策實施

身份驗證

會話

MVC

19.application builder的use和run方法有什麼差別?

這兩個方法都在start up class的configure方法裡面調用。都是用來向應用請求管道裡面添加中間件的。Use方法可以調用下一個中間件的添加,而run不會。

20.dot net core 管道裡面的map拓展有什麼作用?

可以針對不同的路徑添加不同的中間件。

public void Configure(IApplicationBuilder app)
 {
   app.Map("/path1", Middleware1);
   app.Map("/path2", Middleware2);
 }
           

21.dot net core裡面的路徑是如何處理的?

路徑處理是用來為進入的請求尋找處理函數的機制。所有的路徑在函數運作開始時進行注冊。

主要有兩種路徑處理方式, 正常路徑處理和屬性路徑處理。正常路徑處理就是用MapRoute的方式設定調用路徑,屬性路徑處理是指在調用函數的上方設定一個路徑屬性。

22.dot net core工程裡面有哪些常見的工程檔案?

global, launch setting,app settings,bundle config,bower, package。

23.依賴注入實作原理?

實作DI,核心在于依賴注入容器IContainer,該容器具有以下功能

①.(容器)儲存可用服務的集合 // 要用的特定對象、特定類、接口服務

②.(注冊)提供一種方式将各種部件與他們依賴的服務綁定到一起;// Add...函數或containerBuilder.Register函數,

③.(解析點)為應用程式提供一種方式來請求已配置的對象: 構造函數注入、屬性注入.

運作時,架構會一層層通過反射構造執行個體,最終得到完整對象。

24.ASP.NET Core項目如何設定IP位址和端口号?

可以使用Properties檔案夾下的launchSettings配置檔案來配置不同的啟動方式的時候,分别配置IP和端口号。