事件
Power BI DataViz World Championships
2月14日 下午4時 - 3月31日 下午4時
4 次參賽機會,有機會贏得會議套裝行程,現場參與在拉斯維加斯舉行的總決賽
進一步了解備註
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
此文章示範如何使用 IMiddlewareFactory 與 IMiddleware 作為以協力廠商容器啟用中介軟體的擴充點。 如需 IMiddlewareFactory
和 IMiddleware
的簡介資訊,請參閱在 ASP.NET Core 中以 Factory 為基礎的中介軟體啟用。
檢視或下載範例程式碼 \(英文\) (如何下載)
範例應用程式會示範如何透過 IMiddlewareFactory
的實作 SimpleInjectorMiddlewareFactory
來啟用中介軟體。 此範例會使用 Simple Injector 相依性插入 (DI) 容器。
範例的中介軟體實作會記錄查詢字串參數 (key
) 所提供的值。 中介軟體會使用插入的資料庫內容 (範圍服務),以記錄記憶體內部資料庫的查詢字串值。
備註
範例應用程式純粹基於示範目的使用 Simple Injector。 使用 Simple Injector 並不表示為其背書。 Simple Injector 文件和 GitHub 問題中所述的中介軟體啟用方法是 Simple Injector 維護人員建議使用的方法。 如需詳細資訊,請參閱 Simple Injector documentation (Simple Injector 文件) 和 Simple Injector GitHub repository (Simple Injector GitHub 存放庫)。
IMiddlewareFactory 提供建立中介軟體的方法。
在範例應用程式中,將實作中介軟體 Factory 來建立 SimpleInjectorActivatedMiddleware
執行個體。 中介軟體 Factory 會使用 Simple Injector 容器來解析中介軟體:
public class SimpleInjectorMiddlewareFactory : IMiddlewareFactory
{
private readonly Container _container;
public SimpleInjectorMiddlewareFactory(Container container)
{
_container = container;
}
public IMiddleware Create(Type middlewareType)
{
return _container.GetInstance(middlewareType) as IMiddleware;
}
public void Release(IMiddleware middleware)
{
// The container is responsible for releasing resources.
}
}
IMiddleware 可定義應用程式要求管線的中介軟體。
IMiddlewareFactory
實作所啟動的中介軟體 (Middleware/SimpleInjectorActivatedMiddleware.cs
):
public class SimpleInjectorActivatedMiddleware : IMiddleware
{
private readonly AppDbContext _db;
public SimpleInjectorActivatedMiddleware(AppDbContext db)
{
_db = db;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var keyValue = context.Request.Query["key"];
if (!string.IsNullOrWhiteSpace(keyValue))
{
_db.Add(new Request()
{
DT = DateTime.UtcNow,
MiddlewareActivation = "SimpleInjectorActivatedMiddleware",
Value = keyValue
});
await _db.SaveChangesAsync();
}
await next(context);
}
}
為中介軟體 (Middleware/MiddlewareExtensions.cs
) 建立延伸模組:
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
必須執行幾項工作:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
// Replace the default middleware factory with the
// SimpleInjectorMiddlewareFactory.
services.AddTransient<IMiddlewareFactory>(_ =>
{
return new SimpleInjectorMiddlewareFactory(_container);
});
// Wrap ASP.NET Core requests in a Simple Injector execution
// context.
services.UseSimpleInjectorAspNetRequestScoping(_container);
// Provide the database context from the Simple
// Injector container whenever it's requested from
// the default service container.
services.AddScoped<AppDbContext>(provider =>
_container.GetInstance<AppDbContext>());
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.Register<AppDbContext>(() =>
{
var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
optionsBuilder.UseInMemoryDatabase("InMemoryDb");
return new AppDbContext(optionsBuilder.Options);
}, Lifestyle.Scoped);
_container.Register<SimpleInjectorActivatedMiddleware>();
_container.Verify();
}
此中介軟體會在要求處理管線的 Startup.Configure
中註冊:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
此文章示範如何使用 IMiddlewareFactory 與 IMiddleware 作為以協力廠商容器啟用中介軟體的擴充點。 如需 IMiddlewareFactory
和 IMiddleware
的簡介資訊,請參閱在 ASP.NET Core 中以 Factory 為基礎的中介軟體啟用。
檢視或下載範例程式碼 \(英文\) (如何下載)
範例應用程式會示範如何透過 IMiddlewareFactory
的實作 SimpleInjectorMiddlewareFactory
來啟用中介軟體。 此範例會使用 Simple Injector 相依性插入 (DI) 容器。
範例的中介軟體實作會記錄查詢字串參數 (key
) 所提供的值。 中介軟體會使用插入的資料庫內容 (範圍服務),以記錄記憶體內部資料庫的查詢字串值。
備註
範例應用程式純粹基於示範目的使用 Simple Injector。 使用 Simple Injector 並不表示為其背書。 Simple Injector 文件和 GitHub 問題中所述的中介軟體啟用方法是 Simple Injector 維護人員建議使用的方法。 如需詳細資訊,請參閱 Simple Injector documentation (Simple Injector 文件) 和 Simple Injector GitHub repository (Simple Injector GitHub 存放庫)。
IMiddlewareFactory 提供建立中介軟體的方法。
在範例應用程式中,將實作中介軟體 Factory 來建立 SimpleInjectorActivatedMiddleware
執行個體。 中介軟體 Factory 會使用 Simple Injector 容器來解析中介軟體:
public class SimpleInjectorMiddlewareFactory : IMiddlewareFactory
{
private readonly Container _container;
public SimpleInjectorMiddlewareFactory(Container container)
{
_container = container;
}
public IMiddleware Create(Type middlewareType)
{
return _container.GetInstance(middlewareType) as IMiddleware;
}
public void Release(IMiddleware middleware)
{
// The container is responsible for releasing resources.
}
}
IMiddleware 可定義應用程式要求管線的中介軟體。
IMiddlewareFactory
實作所啟動的中介軟體 (Middleware/SimpleInjectorActivatedMiddleware.cs
):
public class SimpleInjectorActivatedMiddleware : IMiddleware
{
private readonly AppDbContext _db;
public SimpleInjectorActivatedMiddleware(AppDbContext db)
{
_db = db;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
var keyValue = context.Request.Query["key"];
if (!string.IsNullOrWhiteSpace(keyValue))
{
_db.Add(new Request()
{
DT = DateTime.UtcNow,
MiddlewareActivation = "SimpleInjectorActivatedMiddleware",
Value = keyValue
});
await _db.SaveChangesAsync();
}
await next(context);
}
}
為中介軟體 (Middleware/MiddlewareExtensions.cs
) 建立延伸模組:
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseSimpleInjectorActivatedMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<SimpleInjectorActivatedMiddleware>();
}
}
Startup.ConfigureServices
必須執行幾項工作:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// Replace the default middleware factory with the
// SimpleInjectorMiddlewareFactory.
services.AddTransient<IMiddlewareFactory>(_ =>
{
return new SimpleInjectorMiddlewareFactory(_container);
});
// Wrap ASP.NET Core requests in a Simple Injector execution
// context.
services.UseSimpleInjectorAspNetRequestScoping(_container);
// Provide the database context from the Simple
// Injector container whenever it's requested from
// the default service container.
services.AddScoped<AppDbContext>(provider =>
_container.GetInstance<AppDbContext>());
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
_container.Register<AppDbContext>(() =>
{
var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
optionsBuilder.UseInMemoryDatabase("InMemoryDb");
return new AppDbContext(optionsBuilder.Options);
}, Lifestyle.Scoped);
_container.Register<SimpleInjectorActivatedMiddleware>();
_container.Verify();
}
此中介軟體會在要求處理管線的 Startup.Configure
中註冊:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseSimpleInjectorActivatedMiddleware();
app.UseStaticFiles();
app.UseMvc();
}
事件
Power BI DataViz World Championships
2月14日 下午4時 - 3月31日 下午4時
4 次參賽機會,有機會贏得會議套裝行程,現場參與在拉斯維加斯舉行的總決賽
進一步了解訓練
模組
在 ASP.NET Core 中設定具有相依性插入的服務 - Training
了解並實作 ASP.NET Core 應用程式中的相依性插入。 使用 ASP.NET Core 的內建服務容器來管理相依性。 向服務容器註冊服務。
文件
了解如何在 ASP.NET Core 中搭配使用 Factory 啟用實作與強型別中介軟體。
了解如何在 ASP.NET Core 中讀取要求本文及寫入回應本文。
了解如何在 ASP.NET Core 中使用要求解壓縮中介軟體