NET Core 支援相依性注入 (Dependency Injection,DI) 軟體設計模式。
在以前 .NET Framework 時期,需要安裝額外套件才能支援 DI
相依性注入(Dependency Injection)是軟體設計中的一個重要概念,它有助於實現程式碼的模組化、可測試性和鬆散耦合。以下是對相依性注入的簡單介紹:
相依性:在軟體中,一個模組或類別可能需要使用其他模組或類別的服務或物件,這種需求被稱為相依性。這些相依性通常以物件實例、函數或其他資源的形式存在。
例如程式中 A 物件 呼叫了 B物件才能執行,則 A物件跟B物件有相依性
相依性注入:相依性注入是一種設計模式,它的目標是將一個物件的相依性(通常是服務或資源)從該物件本身中解耦。這樣做的好處是可以更容易地測試、維護和擴展程式碼。
我們可以透過相依性注入,來控制或管理 A物件所使用的 B物件。
例如在 UnitOfWork 中,我們使用的 MyBlogContext , 在 Program.cs 已經註冊過了。所以在建構式宣告,由 DI 進行建構式注入來提供。
public class UnitOfWork : IUnitOfWork
{
public DbContext Context { get; set; }
// 建構式注入
public UnitOfWork(MyBlogContext dbContext)
{
Context = dbContext;
}
builder.Services.AddDbContext<MyBlogContext>(...)
Scoped (範圍內的實體)
-該物件只會在每個請求間共用一個物件,在第一次注入時建立新物件
Singleton (單一實體)
-當網站啟動時,在第一次注入時建立新物件
最常使用的順序也是 1. Transient 2. Scoped 3.Singleton 三個順序
而 AddDbContext 是屬於 Scoped ,在整個請求期間都是同一個 DbContext 。所以你若確定你建立的 Repository 或 Service 可以只用 Scoped 也是可以。
uilder.Services.AddDbContext<MyBlogContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MyBlogConnection"))
);
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
builder.Services.AddScoped<IPostRepository, PostRepository>();
builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddScoped<IOptionRepository, OptionRepository>();
若你的 UnitOfWork 想跟 MyBlogContext 解耦合,變成相依於 DbContext,可以這麼設定
public class UnitOfWork : IUnitOfWork
{
public DbContext Context { get; set; }
// 建構式注入
public UnitOfWork(DbContext dbContext)
{
Context = dbContext;
}
builder.Services.AddDbContext<MyBlogContext>(...)
builder.Services.AddScoped<DbContext, MyBlogContext>();
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();