成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入剖析.NET源代碼中的設(shè)計(jì)模式思想與實(shí)踐:創(chuàng)建型模式

開發(fā) 前端
DbProviderFactory 是一個(gè)抽象工廠類,提供了一種方式來(lái)創(chuàng)建與 ADO.NET 數(shù)據(jù)庫(kù)提供程序所支持的特定數(shù)據(jù)源的命令對(duì)象、連接對(duì)象、數(shù)據(jù)適配器對(duì)象和數(shù)據(jù)讀取器對(duì)象。 它使得應(yīng)用程序可以在不直接調(diào)用特定數(shù)據(jù)庫(kù)提供程序的情況下與多個(gè)數(shù)據(jù)庫(kù)提供程序進(jìn)行交互,從而提高了代碼的可移植性和靈活性。

在 .NET 源代碼中,設(shè)計(jì)模式是常見的編程范式,用于解決經(jīng)典的問(wèn)題,如對(duì)象創(chuàng)建、接口解耦、算法透明等。本文將介紹.NET 源代碼中常見的設(shè)計(jì)模式及其示例。

創(chuàng)建型模式

創(chuàng)建型模式用于處理對(duì)象的創(chuàng)建過(guò)程,包括對(duì)象的實(shí)例化時(shí)機(jī)、構(gòu)造方法參數(shù)、實(shí)例化過(guò)程等。常見的創(chuàng)建型模式有:

  • 工廠方法模式 (Factory Method Pattern)
  • 抽象工廠模式 (Abstract Factory Pattern)
  • 單例模式 (Singleton Pattern)
  • 建造者模式 (Builder Pattern)
  • 原型模式 (Prototype Pattern)

這些設(shè)計(jì)模式是.NET 源代碼中的精華所在,在實(shí)際開發(fā)中也有廣泛應(yīng)用。

設(shè)計(jì)模式和示例

以下是一些 .NET 源代碼中常見的設(shè)計(jì)模式及其示例:

1、工廠模式

工廠模式 - Factory Pattern 在 .NET 中使用工廠模式來(lái)創(chuàng)建對(duì)象。例如,以下是 .NET 中使用的一些工廠模式示例:

  • 在 System.Data 中,使用 DbProviderFactory 工廠類來(lái)創(chuàng)建數(shù)據(jù)庫(kù)提供程序;
  • 在 System.Net.Sockets 中,使用 SocketFactory 工廠類來(lái)創(chuàng)建套接字;
  • 在 System.Threading.Tasks.Dataflow 中,使用 DataflowBlockOptions 靜態(tài)工廠方法來(lái)創(chuàng)建數(shù)據(jù)流塊。

DbProviderFactory說(shuō)明和示例

DbProviderFactory 是一個(gè)抽象工廠類,提供了一種方式來(lái)創(chuàng)建與 ADO.NET 數(shù)據(jù)庫(kù)提供程序所支持的特定數(shù)據(jù)源的命令對(duì)象、連接對(duì)象、數(shù)據(jù)適配器對(duì)象和數(shù)據(jù)讀取器對(duì)象。 它使得應(yīng)用程序可以在不直接調(diào)用特定數(shù)據(jù)庫(kù)提供程序的情況下與多個(gè)數(shù)據(jù)庫(kù)提供程序進(jìn)行交互,從而提高了代碼的可移植性和靈活性。

在 .NET Framework 中,常用的數(shù)據(jù)庫(kù)提供程序如 System.Data.SqlClient、System.Data.OracleClient、System.Data.OleDb、System.Data.Odbc 等都繼承自 DbProviderFactory 類,并實(shí)現(xiàn)了它的抽象成員,如 CreateCommand(), CreateConnection(), CreateDataAdapter(), CreateParameter() 等,這些成員通過(guò)使用特定數(shù)據(jù)庫(kù)的 ADO.NET 提供程序,來(lái)創(chuàng)建與該數(shù)據(jù)庫(kù)所兼容的命令對(duì)象、連接對(duì)象、數(shù)據(jù)適配器對(duì)象和數(shù)據(jù)讀取器對(duì)象。

使用 DbProviderFactory 可以避免將應(yīng)用程序綁定到特定的數(shù)據(jù)庫(kù)提供程序,并且它還可以通過(guò)簡(jiǎn)單地更改配置文件中的設(shè)置來(lái)切換到另一個(gè)數(shù)據(jù)庫(kù)提供程序,從而增加了代碼的靈活性。例如,可以在 Web.config 文件中指定與 Oracle 數(shù)據(jù)庫(kù)兼容的數(shù)據(jù)庫(kù)提供程序,在另一個(gè) config 文件中指定與 SQL Server 數(shù)據(jù)庫(kù)兼容的數(shù)據(jù)庫(kù)提供程序,然后通過(guò)更改配置文件來(lái)切換到不同的數(shù)據(jù)庫(kù)提供程序。

下面是一個(gè)使用 DbProviderFactory 創(chuàng)建 SQL Server 數(shù)據(jù)庫(kù)連接對(duì)象的示例:

using System;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;

public class Program
{
    static void Main(string[] args)
    {
        // 獲取數(shù)據(jù)庫(kù)提供程序工廠
        DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient");

        // 創(chuàng)建連接對(duì)象
        using (DbConnection connection = factory.CreateConnection())
        {
            // 從配置文件中獲取連接字符串
            string connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

            // 設(shè)置連接對(duì)象的連接字符串
            connection.ConnectionString = connectionString;

            // 打開連接
            connection.Open();

            Console.WriteLine("連接成功!");

            // 關(guān)閉連接
            connection.Close();
        }
    }
}

在這個(gè)示例中,我們首先通過(guò)
DbProviderFactories.GetFactory() 方法獲取了一個(gè)特定的數(shù)據(jù)庫(kù)提供程序工廠。然后,我們使用 CreateConnection() 方法創(chuàng)建了一個(gè)連接對(duì)象,并從配置文件中獲取了一個(gè)連接字符串。最后,我們通過(guò)調(diào)用 Open() 方法打開連接,并在控制臺(tái)輸出了一條連接成功的消息。當(dāng)使用完連接對(duì)象之后,我們應(yīng)該調(diào)用 Close() 方法關(guān)閉連接,以釋放與之關(guān)聯(lián)的任何資源。

SocketFactory說(shuō)明和示例

在 System.Net.Sockets 命名空間中,可以使用 SocketFactory 工廠類來(lái)創(chuàng)建套接字。SocketFactory 提供了一些靜態(tài)方法來(lái)創(chuàng)建不同類型的套接字,例如 CreateSocket() 方法可以用于創(chuàng)建一個(gè)基于 TCP/IP 協(xié)議的套接字實(shí)例。

下面是一個(gè)使用 SocketFactory 創(chuàng)建套接字的示例:

using System.Net.Sockets;

// 創(chuàng)建一個(gè)基于TCP/IP協(xié)議的套接字
Socket tcpSocket = SocketFactory.CreateSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

// 設(shè)置套接字選項(xiàng)
tcpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

在上面的示例中,我們使用了 SocketFactory 工廠類的 CreateSocket 靜態(tài)方法來(lái)創(chuàng)建一個(gè)基于 TCP/IP 協(xié)議的套接字實(shí)例。然后,我們使用 SetSocketOption 方法為套接字設(shè)置一些選項(xiàng),例如重用地址選項(xiàng)等。

需要注意的是,SocketFactory 工廠類雖然提供了方便的套接字創(chuàng)建方法,但在某些情況下可能不夠靈活,無(wú)法滿足一些特定需求。這時(shí),可以通過(guò)手動(dòng)創(chuàng)建一個(gè) Socket 實(shí)例并設(shè)置其屬性和選項(xiàng)來(lái)獲得更精細(xì)的控制。

DataflowBlockOptions說(shuō)明和示例


System.Threading.Tasks.Dataflow 命名空間中,為了方便使用和創(chuàng)建數(shù)據(jù)流塊,提供了一些靜態(tài)工廠方法來(lái)創(chuàng)建常用的數(shù)據(jù)流塊類型,這些工廠方法會(huì)返回已經(jīng)設(shè)置好一些默認(rèn)選項(xiàng)的數(shù)據(jù)流塊實(shí)例。

這些靜態(tài)工廠方法通常會(huì)使用 DataflowBlockOptions 作為參數(shù),以便為創(chuàng)建的數(shù)據(jù)流塊設(shè)置選項(xiàng)。下面是幾個(gè)常用的靜態(tài)工廠方法示例:

  • TransformBlock<TInput,TOutput>(Func<TInput,TOutput>, DataflowBlockOptions):創(chuàng)建一個(gè)轉(zhuǎn)換塊,用于從輸入元素中轉(zhuǎn)換出新的輸出元素。
  • BroadcastBlock<T>(DataflowBlockOptions):創(chuàng)建一個(gè)廣播塊,它將每個(gè)輸入元素廣播到多個(gè)目標(biāo)塊中。
  • BufferBlock<T>(DataflowBlockOptions):創(chuàng)建一個(gè)緩沖塊,用于在不同塊之間存儲(chǔ)元素的緩沖區(qū)。
  • ActionBlock<T>(Action<T>, DataflowBlockOptions):創(chuàng)建一個(gè)動(dòng)作塊,用于執(zhí)行某些操作而不生成任何輸出元素。

下面是一個(gè)使用靜態(tài)工廠方法創(chuàng)建數(shù)據(jù)流塊的示例:

using System.Threading.Tasks.Dataflow;

// 創(chuàng)建一個(gè)轉(zhuǎn)換塊,將int類型的輸入轉(zhuǎn)換為double類型的輸出
var transformBlock = new TransformBlock<int, double>(
    input => input * 2.0,   // 轉(zhuǎn)換函數(shù)
    new DataflowBlockOptions()  // 使用DataflowBlockOptions設(shè)置選項(xiàng)
    {
        BoundedCapacity = 10,   // 設(shè)置緩沖區(qū)大小
        CancellationToken = cancellationToken,   // 設(shè)置取消標(biāo)記
        MaxDegreeOfParallelism = 2   // 設(shè)置最大并行度為2
    }
);

在上面的示例中,我們使用了 TransformBlock 靜態(tài)工廠方法來(lái)創(chuàng)建一個(gè)轉(zhuǎn)換塊,并將其配置為可以處理 int 類型的輸入,并且將其轉(zhuǎn)換為 double 類型的輸出。同時(shí),我們使用了 DataflowBlockOptions 參數(shù)來(lái)設(shè)置了一些常用選項(xiàng),包括了緩沖區(qū)大小、取消標(biāo)記以及最大并行度等。

2、單例模式

單例模式 - Singleton Pattern 在 .NET 中使用單例模式來(lái)創(chuàng)建全局唯一的對(duì)象和服務(wù)。例如,以下是 .NET 中使用的一些單例模式示例:

  • 在 System.Diagnostics 中,使用 TraceSource 類來(lái)創(chuàng)建全局唯一的跟蹤源;
  • 在 System.Net 中,使用 ServicePointManager 類來(lái)創(chuàng)建全局唯一的服務(wù)點(diǎn)管理器;
  • 在 ASP.NET 中,使用 HttpRuntime 類來(lái)創(chuàng)建全局唯一的運(yùn)行時(shí)對(duì)象。

TraceSource說(shuō)明和示例

在 System.Diagnostics 命名空間中,可以使用 TraceSource 類來(lái)創(chuàng)建全局唯一的跟蹤源,以便進(jìn)行跟蹤和調(diào)試工作。

TraceSource 跟蹤源提供了一種跟蹤和記錄應(yīng)用程序的方式,它具有比 Trace 和 Debug 類更高的靈活性和可配置性。使用 TraceSource 類創(chuàng)建的跟蹤源可以定義多個(gè)監(jiān)聽器,每個(gè)監(jiān)聽器可以將跟蹤信息記錄到不同的目標(biāo),例如控制臺(tái)、文本文件、事件日志等。

下面是一個(gè)示例,展示如何使用 TraceSource 類創(chuàng)建全局唯一的跟蹤源:

using System.Diagnostics;

// 創(chuàng)建一個(gè)名為 "MyApp" 的跟蹤源
TraceSource traceSource = new TraceSource("MyApp");

// 添加一個(gè)名稱為 "console" 的 TextWriterTraceListener 監(jiān)聽器
traceSource.Listeners.Add(new TextWriterTraceListener(Console.Out, "console"));

// 啟用跟蹤級(jí)別為 Verbose 的跟蹤信息
traceSource.Switch.Level = SourceLevels.Verbose;

// 在跟蹤源上記錄一條信息
traceSource.TraceInformation("Hello, world!");

在上面的示例中,我們首先創(chuàng)建了一個(gè)名為 "MyApp" 的跟蹤源,并向其添加了一個(gè)名稱為 "console" 的監(jiān)聽器,該監(jiān)聽器將跟蹤信息輸出到控制臺(tái)。然后,我們使用 Switch 屬性來(lái)啟用跟蹤級(jí)別為 Verbose 的跟蹤信息,最后通過(guò) TraceInformation 方法在跟蹤源上記錄了一條信息。

需要注意的是,TraceSource 的使用與 Trace 和 Debug 類相比更加復(fù)雜,這是因?yàn)樗峁┝烁叩撵`活性和可配置性。在實(shí)際應(yīng)用中,應(yīng)根據(jù)需要選擇適當(dāng)?shù)母櫡绞胶凸ぞ撸⑦M(jìn)行合理的跟蹤級(jí)別設(shè)置,以避免對(duì)應(yīng)用程序性能和安全造成不必要的影響。

ServicePointManager說(shuō)明和示例

在 System.Net 命名空間中,可以使用 ServicePointManager 類來(lái)創(chuàng)建全局唯一的服務(wù)點(diǎn)管理器,以便對(duì) HTTP 連接進(jìn)行管理和配置。

ServicePointManager 類提供了一種集中式管理服務(wù)點(diǎn)的方式,它允許設(shè)置一些常見的 HTTP 協(xié)議參數(shù),例如超時(shí)、緩存、安全等級(jí)等。使用 ServicePointManager 創(chuàng)建的服務(wù)點(diǎn)可以在應(yīng)用程序范圍內(nèi)共享和重用,從而提高應(yīng)用程序的性能和可維護(hù)性。

下面是一個(gè)示例,展示如何使用 ServicePointManager 類創(chuàng)建全局唯一的服務(wù)點(diǎn)管理器:

using System.Net;

// 設(shè)置默認(rèn)的最大連接數(shù)和默認(rèn)連接超時(shí)時(shí)間
ServicePointManager.DefaultConnectionLimit = 10;
ServicePointManager.DefaultConnectTimeout = 10000;

// 創(chuàng)建一個(gè)新的服務(wù)點(diǎn)并設(shè)置特定的 HTTP 選項(xiàng)
ServicePoint sp = ServicePointManager.FindServicePoint(new Uri("http://www.example.com"));
sp.ConnectionLeaseTimeout = 60000;

// 使用服務(wù)點(diǎn)發(fā)送 HTTP 請(qǐng)求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("http://www.example.com"));
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

在上面的示例中,我們首先使用 ServicePointManager 類設(shè)置了默認(rèn)的最大連接數(shù)和連接超時(shí)時(shí)間。然后,我們創(chuàng)建了一個(gè)新的服務(wù)點(diǎn),并設(shè)置了該服務(wù)點(diǎn)的連接租約超時(shí)時(shí)間。最后,我們使用該服務(wù)點(diǎn)發(fā)送了一個(gè) HTTP 請(qǐng)求。

需要注意的是,ServicePointManager 類提供了一些常見的 HTTP 協(xié)議參數(shù)設(shè)置,但是并不適用于所有場(chǎng)景。在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體的業(yè)務(wù)需求和系統(tǒng)環(huán)境來(lái)選擇合適的 HTTP 參數(shù)設(shè)置方式,并進(jìn)行適當(dāng)?shù)卣{(diào)整和優(yōu)化。

HttpRuntime說(shuō)明和示例

在 ASP.NET 中,可以使用 HttpRuntime 類來(lái)創(chuàng)建全局唯一的運(yùn)行時(shí)對(duì)象,以便對(duì) ASP.NET 應(yīng)用程序進(jìn)行管理和配置。

HttpRuntime 類是 ASP.NET 運(yùn)行時(shí)環(huán)境的核心類之一,它提供了一種集中式管理 ASP.NET 應(yīng)用程序的方式。使用 HttpRuntime 創(chuàng)建的運(yùn)行時(shí)對(duì)象可以訪問(wèn)和設(shè)置一些重要的應(yīng)用程序參數(shù),例如應(yīng)用程序域、路徑映射、編譯器選項(xiàng)等。

下面是一個(gè)示例,展示如何使用 HttpRuntime 類創(chuàng)建全局唯一的運(yùn)行時(shí)對(duì)象:

using System.Web;

// 獲取全局唯一的 HttpRuntime 對(duì)象
HttpRuntime runtime = HttpRuntime.AppDomainAppId == null ? null : HttpRuntime.Instance;

// 輸出當(dāng)前應(yīng)用程序域的 ID
string appDomainId = runtime?.AppDomainId;
Console.WriteLine("Current app domain ID: " + appDomainId);

// 輸出當(dāng)前應(yīng)用程序的虛擬路徑
string appVirtualPath = runtime?.AppVirtualPath;
Console.WriteLine("Current app virtual path: " + appVirtualPath);

在上面的示例中,我們首先使用 HttpRuntime 類獲取了全局唯一的運(yùn)行時(shí)對(duì)象,并輸出了當(dāng)前應(yīng)用程序域的 ID 和當(dāng)前應(yīng)用程序的虛擬路徑。

需要注意的是,HttpRuntime 類并不適用于所有場(chǎng)景,它主要用于管理和配置 ASP.NET 應(yīng)用程序本身。在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體的業(yè)務(wù)需求和系統(tǒng)環(huán)境來(lái)選擇合適的 ASP.NET 參數(shù)設(shè)置方式,并進(jìn)行適當(dāng)?shù)卣{(diào)整和優(yōu)化。

3、建造者模式

建造者模式 - Builder Pattern 在 .NET 中,使用建造者模式來(lái)創(chuàng)建和組裝復(fù)雜對(duì)象。例如,以下是 .NET 中使用的一些建造者模式示例:

  • 在 ASP.NET Core 中,使用 Startup 類中的 ConfigureServices 和 Configure 方法來(lái)組裝 Web 應(yīng)用程序的服務(wù)和中間件;
  • 在 Entity Framework 中,使用 DbContextOptionsBuilder 和 DbContext 構(gòu)造函數(shù)來(lái)配置和創(chuàng)建數(shù)據(jù)上下文;
  • 在 Prism 中,使用 IUnityContainer 接口和 RegisterType 方法來(lái)實(shí)現(xiàn)依賴項(xiàng)注入和對(duì)象構(gòu)建。

Startup說(shuō)明和示例

在ASP.NET Core中,使用 Startup 類中的 ConfigureServices 和 Configure 方法來(lái)組裝 Web 應(yīng)用程序的服務(wù)和中間件。

ConfigureServices 方法在應(yīng)用程序啟動(dòng)時(shí)被調(diào)用,用于注冊(cè)應(yīng)用程序所需的服務(wù)。在這個(gè)方法中,可以通過(guò)依賴注入容器向應(yīng)用程序添加服務(wù),并配置服務(wù)的生命周期、作用域等屬性。

Configure 方法則用于配置應(yīng)用程序的 HTTP 請(qǐng)求管道。在這個(gè)方法中,可以添加各種中間件(Middleware)來(lái)處理請(qǐng)求和響應(yīng),例如路由、靜態(tài)文件、認(rèn)證授權(quán)、日志記錄等。

下面是一個(gè)示例,展示了如何在 Startup 類中使用 ConfigureServices 和 Configure 方法來(lái)組裝 Web 應(yīng)用程序的服務(wù)和中間件:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public class Startup
{
    // 注冊(cè)應(yīng)用程序所需的服務(wù)
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddDbContext<MyDbContext>();
        services.AddTransient<IMyService, MyServiceImpl>();
        services.AddAuthentication();
    }

    // 配置應(yīng)用程序的 HTTP 請(qǐng)求管道
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }
        
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller}/{action}/{id?}");
        });
    }
}

在上面的示例中,我們定義了一個(gè) Startup 類,并在 ConfigureServices 方法中注冊(cè)了一些服務(wù),例如 MVC 控制器、數(shù)據(jù)庫(kù)上下文、自定義服務(wù)和身份認(rèn)證等。在 Configure 方法中,我們添加了一些中間件(Middleware),例如開發(fā)者異常頁(yè)、HTTPS 重定向、靜態(tài)文件、路由、身份驗(yàn)證和授權(quán)等。

需要注意的是,ASP.NET Core 中的依賴注入容器通常使用泛型主機(jī)建立,而不是使用全局唯一的靜態(tài)類。因此,在實(shí)際應(yīng)用中,我們需要使用依賴注入容器的 API 來(lái)注冊(cè)和解析服務(wù),而不是直接使用靜態(tài)類。

DbContextOptionsBuilder說(shuō)明和示例

在 Entity Framework 中,使用 DbContextOptionsBuilder 和 DbContext 構(gòu)造函數(shù)來(lái)配置和創(chuàng)建數(shù)據(jù)上下文(DbContext)。

DbContextOptionsBuilder 提供了一種鏈?zhǔn)秸{(diào)用的方式來(lái)配置數(shù)據(jù)上下文的選項(xiàng),例如數(shù)據(jù)庫(kù)連接字符串、日志記錄、緩存策略等。通過(guò) DbContextOptionsBuilder,我們可以靈活地配置數(shù)據(jù)上下文的行為和屬性。

下面是一個(gè)示例,展示了如何使用 DbContextOptionsBuilder 來(lái)配置數(shù)據(jù)上下文的選項(xiàng):

using Microsoft.EntityFrameworkCore;

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }

    public DbSet<MyEntity> MyEntities { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=MyDb;Integrated Security=True;MultipleActiveResultSets=True");
        }
    }
}

在上面的示例中,我們定義了一個(gè)繼承自 DbContext 的數(shù)據(jù)上下文類 MyDbContext,并重載了它的構(gòu)造函數(shù)和 OnConfiguring 方法。在構(gòu)造函數(shù)中,我們接受了一個(gè) DbContextOptions<MyDbContext> 類型的參數(shù),并將其傳遞給基類的構(gòu)造函數(shù)。在 OnConfiguring 方法中,我們檢查當(dāng)前是否已經(jīng)配置了數(shù)據(jù)庫(kù)選項(xiàng),如果沒(méi)有,則使用 SQL Server 數(shù)據(jù)庫(kù)連接字符串配置選項(xiàng)。

需要注意的是,在實(shí)際應(yīng)用中,我們通常不會(huì)在數(shù)據(jù)上下文中硬編碼數(shù)據(jù)庫(kù)連接字符串或其他配置選項(xiàng),而是通過(guò)依賴注入容器和配置文件來(lái)進(jìn)行動(dòng)態(tài)配置。可以使用 IConfiguration 類來(lái)讀取應(yīng)用程序的配置文件,然后將配置選項(xiàng)傳遞給 DbContextOptionsBuilder 的方法中。

在使用數(shù)據(jù)上下文時(shí),我們通常需要使用依賴注入容器來(lái)創(chuàng)建和解析數(shù)據(jù)上下文的實(shí)例。例如,在 ASP.NET Core 中,我們可以使用內(nèi)置的依賴注入容器(IServiceProvider)來(lái)注冊(cè)數(shù)據(jù)上下文,并在需要時(shí)從容器中解析出實(shí)例。

IUnityContainer說(shuō)明和示例

在 Prism 中,可以使用 IUnityContainer 接口和 RegisterType 方法來(lái)實(shí)現(xiàn)依賴項(xiàng)注入和對(duì)象構(gòu)建。

IUnityContainer 是 Unity 容器的接口,用于管理對(duì)象的生命周期和依賴關(guān)系。通過(guò)向容器注冊(cè)類型并指定其依賴項(xiàng),我們可以讓容器自動(dòng)解析對(duì)象和依賴項(xiàng),并在需要時(shí)創(chuàng)建和銷毀對(duì)象實(shí)例。

RegisterType 方法是 IUnityContainer 接口中的一個(gè)方法,用于向容器注冊(cè)類型并指定其依賴項(xiàng)。通過(guò) RegisterType 方法,我們可以指定對(duì)象的生命周期、作用域和其他屬性,并配置容器如何處理對(duì)象和依賴項(xiàng)之間的關(guān)系。

下面是一個(gè)示例,展示了如何使用 IUnityContainer 和 RegisterType 方法來(lái)實(shí)現(xiàn)依賴項(xiàng)注入和對(duì)象構(gòu)建:

using Microsoft.Practices.Unity;

public class MyService : IMyService
{
    private readonly IDbContext dbContext;
    private readonly ILogger logger;

    public MyService(IDbContext dbContext, ILogger logger)
    {
        this.dbContext = dbContext;
        this.logger = logger;
    }

    public void DoSomething()
    {
        // 使用 dbContext 和 logger 執(zhí)行操作
    }
}

// 在應(yīng)用程序啟動(dòng)時(shí)注冊(cè)服務(wù)
var container = new UnityContainer();

container.RegisterType<IDbContext, MyDbContext>(new ContainerControlledLifetimeManager());
container.RegisterType<ILogger, MyLogger>(new TransientLifetimeManager());
container.RegisterType<IMyService, MyService>(new TransientLifetimeManager());

// 在需要使用服務(wù)的地方解析服務(wù)
var myService = container.Resolve<IMyService>();
myService.DoSomething();

在上面的示例中,我們定義了一個(gè)類 MyService,它需要依賴于 IDbContext 和 ILogger 接口。我們使用 RegisterType 方法來(lái)向容器注冊(cè)這些類型,并指定它們的生命周期為 Singleton 和 Transient。最后,在需要使用服務(wù)的地方,我們從容器中解析出實(shí)現(xiàn)了 IMyService 接口的對(duì)象,并調(diào)用其方法。

需要注意的是,在 Prism 中,通常建議我們使用基于接口的編程和依賴項(xiàng)注入,以便實(shí)現(xiàn)松耦合和可測(cè)試性。可以使用 RegisterInstance 方法來(lái)向容器注冊(cè)單例對(duì)象或配置選項(xiàng),也可以使用 RegisterFactory 方法來(lái)自定義對(duì)象創(chuàng)建邏輯。在實(shí)際應(yīng)用中,我們通常會(huì)將容器的配置封裝到模塊或組件中,并通過(guò) Prism 模塊化架構(gòu)來(lái)實(shí)現(xiàn)靈活的應(yīng)用程序架構(gòu)和組織。

4、原型模式

原型模式用于創(chuàng)建與現(xiàn)有對(duì)象相似的新對(duì)象,而不是通過(guò)類的構(gòu)造函數(shù)或工廠方法創(chuàng)造對(duì)象。它適用于創(chuàng)建復(fù)雜對(duì)象的場(chǎng)景,其中構(gòu)造函數(shù)的參數(shù)較多或創(chuàng)建對(duì)象的過(guò)程較為復(fù)雜,或者在創(chuàng)建對(duì)象的代價(jià)較高的情況下,通過(guò)復(fù)制已有的對(duì)象來(lái)創(chuàng)建新對(duì)象可以提高性能。

在 .NET 源代碼中,有一個(gè)和原型模式相關(guān)的接口和一個(gè)實(shí)現(xiàn)。

這個(gè)接口就是 System.ICloneable 接口。它定義了一個(gè)名為 Clone() 的方法,用于創(chuàng)建當(dāng)前對(duì)象的淺表副本。在使用原型模式時(shí),通常我們會(huì)讓對(duì)象實(shí)現(xiàn) ICloneable 接口,并在 Clone() 方法中返回對(duì)象的淺表副本。

下面是一個(gè)示例:

public class MyObject : ICloneable
{
    public int Id { get; set; }
    public string Name { get; set; }

    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

在上面的示例中,我們定義了一個(gè)類 MyObject,它實(shí)現(xiàn)了 ICloneable 接口,并在 Clone() 方法中返回 MemberwiseClone() 的結(jié)果。這個(gè)方法會(huì)創(chuàng)建并返回一個(gè)對(duì)象的淺表副本,也就是僅復(fù)制對(duì)象中的值類型成員和引用類型成員的引用,而不會(huì)復(fù)制整個(gè)對(duì)象圖。

需要注意的是,在使用原型模式時(shí),我們通常需要謹(jǐn)慎處理對(duì)象中的引用類型成員,以確保副本對(duì)象與原始對(duì)象的引用類型成員指向正確的對(duì)象。另外,由于 Clone() 方法只能創(chuàng)建淺表副本,如果需要深復(fù)制對(duì)象圖,則需要使用其他的技術(shù)或模式來(lái)實(shí)現(xiàn),例如序列化和反序列化、手動(dòng)復(fù)制等。

總結(jié)

在使用這些創(chuàng)建型設(shè)計(jì)模式時(shí),我們需要權(quán)衡其優(yōu)缺點(diǎn),并根據(jù)具體場(chǎng)景進(jìn)行選擇。同時(shí),我們需要注意代碼的可維護(hù)性和擴(kuò)展性,并盡可能地遵循SOLID原則,以便更好地管理對(duì)象的創(chuàng)建過(guò)程。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2010-06-17 14:35:03

設(shè)計(jì)模式 UML

2021-05-18 08:52:31

Prototype 原型模式設(shè)計(jì)模式

2021-10-28 19:09:09

模式原型Java

2020-10-21 14:29:15

原型模式

2013-11-26 17:00:08

Android設(shè)計(jì)模式

2012-08-30 09:07:33

設(shè)計(jì)模式

2010-01-21 09:08:53

.NET設(shè)計(jì)模式

2020-06-08 08:04:49

設(shè)計(jì)模式結(jié)構(gòu)型接口

2024-05-31 12:59:03

2016-06-20 11:32:27

JS原型class

2017-02-06 09:20:23

JavaScript實(shí)踐

2010-09-13 09:17:27

DIV頁(yè)面

2023-11-02 21:11:11

JavaScript設(shè)計(jì)模式

2010-06-04 18:29:02

Hadoop單機(jī)模式

2009-03-30 09:39:04

觀察者思想換位設(shè)計(jì)模式

2025-02-10 00:25:00

命令模式擴(kuò)展機(jī)制系統(tǒng)

2024-04-29 08:06:19

Redis分布式系統(tǒng)

2022-09-21 08:47:05

項(xiàng)目多線程對(duì)象

2009-10-14 10:26:00

Route組件

2024-06-19 16:02:46

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产粉嫩尤物极品99综合精品 | 国产免费一级片 | 一区二区三区视频在线观看 | 91资源在线| 色嗨嗨 | 日日操操操 | 国产精品美女久久久久aⅴ国产馆 | 麻豆国产一区二区三区四区 | 成年无码av片在线 | 亚洲成人精选 | 久久久一区二区三区 | 日韩精品一二三 | 久久精品亚洲精品国产欧美 | 中文字幕av第一页 | 国产精品伦一区二区三级视频 | 国产一级视屏 | 日本中文在线视频 | 久久国产精品无码网站 | 日韩精品区 | 热久久久| 国产精久久久久久久 | 一区中文字幕 | 亚洲欧美成人在线 | 免费观看羞羞视频网站 | 中日字幕大片在线播放 | 成人在线免费观看av | 亚洲黄色一区二区三区 | 丁香婷婷在线视频 | 久久久亚洲精品视频 | 日日爱夜夜操 | 五月天婷婷综合 | 成人99 | 欧美二区三区 | 免费在线观看黄视频 | 成人一区二区三区在线观看 | 在线视频一区二区三区 | 亚洲欧美视频在线观看 | 一区二区三区视频 | 一区二区高清在线观看 | 黄a在线播放 | 欧美区日韩区 |