در اینجا نحوه استفاده از کانتینر سرویس ASP.NET Core برای تزریق وابستگی را یاد خواهیم گرفت.
راه حل
یک سرویس ایجاد کنید.
- public interface IGreetingService
- {
- string Greet(string to);
- }
- public class GreetingService : IGreetingService
- {
- public string Greet(string to)
- {
- return $"Hello {to}";
- }
- }
در صورت نیاز تزریق کنید، من از Middleware ایجاد شده در پست قبلی استفاده می کنم .
- public static class UseMiddlewareExtensions
- {
- public static IApplicationBuilder UseHelloWorld(this IApplicationBuilder app)
- {
- return app.UseMiddleware();
- }
- }
- public class HelloWorldMiddleware
- {
- private readonly RequestDelegate next;
- public HelloWorldMiddleware(
- RequestDelegate next)
- {
- this.next = next;
- }
- public async Task Invoke(
- HttpContext context,
- IGreetingService greetingService)
- {
- var message = greetingService.Greet("World (via DI)");
- await context.Response.WriteAsync(message);
- }
- }
با استفاده از AddScoped() در متد ConfigureServices Startup.cs سرویس را به ظرف اضافه کنید.
- public void ConfigureServices(
- IServiceCollection services)
- {
- // setup dependency injection in service container
- services.AddScoped<IGreetingService, GreetingService>();
- }
- public void Configure(
- IApplicationBuilder app,
- IHostingEnvironment env)
- {
- // setup request pipeline using middleware
- app.UseHelloWorld();
- }
فرض کنید اجرای سرویس شما به تنظیمات پیچیده تری نیاز دارد. می توانید از اضافه بار استفاده کنید که روش کارخانه ای را می پذیرد. فرض کنید سرویس ما یک پارامتر را می پذیرد.
- public class FlexibleGreetingService : IGreetingService
- {
- private readonly string sayWhat;
- public FlexibleGreetingService(string sayWhat)
- {
- this.sayWhat = sayWhat;
- }
- public string Greet(string to)
- {
- return $"{this.sayWhat} {to}";
- }
- }
ما می توانیم از روش کارخانه برای اضافه کردن این به کانتینر سرویس استفاده کنیم.
- public void ConfigureServices(
- IServiceCollection services)
- {
- // setup dependency injection in service container
- services.AddScoped(factory =>
- {
- return new FlexibleGreetingService("Good Morning");
- });
- }
در صورت طول عمر Singleton، اضافه بار اضافی یک نمونه از خدمات را می پذیرد.
- public void ConfigureServices(
- IServiceCollection services)
- {
- // setup dependency injection in service container
- services.AddSingleton(
- new FlexibleGreetingService("Good Evening"));
- }
بحث
ASP.NET Core دارای یک ظرف سرویس داخلی سبک وزن است. ما خدمات خود را در روش ConfigureServices() Startup.cs پیکربندی می کنیم. همانطور که در پست قبلی بحث شد ، این متد قبل از متد ()Configure اجرا می شود، از این رو ما می توانیم هنگام راه اندازی هر میان افزاری (از جمله MVC) از خدمات خود استفاده کنیم.
روش پیشفرض تزریق از طریق سازندههای عمومی است که برای اکثر سناریوها بهترین عمل در نظر گرفته میشود.
طول عمر خدمات
کانتینر سرویس طول عمر خدمات اضافه شده به آن را مدیریت می کند. در زیر روش هایی برای انجام این کار آورده شده است.
- AddScoped() - این سرویس ها یک بار در هر درخواست ایجاد می شوند.
- AddTransient() - این سرویس ها هر بار که درخواست می شوند ایجاد می شوند.
- AddSingleton() - این سرویس ها اولین باری که درخواست می شوند ایجاد می شوند و برای درخواست های بعدی یکسان می مانند.
توجه داشته باشید که
EF باید به صورت Scoped یا با استفاده از IServiceCollection.AddDbContext
اضافه شودکه این کار را در پشت صحنه انجام می دهد. روش های کارخانه ای
همه روش های فوق دارای اضافه بار برای اضافه کردن سرویس با استفاده از روش کارخانه هستند. این می تواند برای سرویس هایی مفید باشد که به تنظیمات پیچیده تری نیاز دارند، به عنوان مثال - با استفاده از الگوی سازنده.