dir.by  
  Поиск  
Программирование, разработка, тестирование
.NET Core
Встроенный контейнер IoC в ASP.NET Core
  Посмотрели 5078 раз(а)    
 Встроенный контейнер IoC в ASP.NET Core 
последнее обновление: 13 марта 2019
ASP.NET Core уже имеет встроенный контейнер внедрения зависимостей, который представлен интерфейсом IServiceProvider
Шаг 1
За установку сервисов в приложении отвечает метод ConfigureServices, определенный в классе Startup.
  C#     файл Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using WebApplication1.Services;

namespace WebApplication1
{
     public class Startup
     {
          // This method gets called by the runtime. Use this method to add services to the container.
          // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
          public void ConfigureServices(IServiceCollection services)
          {
               services.AddMvc();
               services.AddSingleton<IMyServ1, MyServ1>();
          }

          // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
          public void Configure(IApplicationBuilder app, IHostingEnvironment env)
          {
               if (env.IsDevelopment())
               {
                    app.UseDeveloperExceptionPage();
               }

               app.UseMvcWithDefaultRoute();
          }
     }
}
Шаг 2 типы
Сервисы, которые создаются механизмом Depedency Injection, могут представлять один из следующих типов:
services.AddTransient<...>();
при каждом обращении к сервису создается новый объект сервиса. В течение одного запроса может быть несколько обращений к сервису, соответственно при каждом обращении будет создаваться новый объект. Подобная модель жизненного цикла наиболее подходит для легковесных сервисов, которые не хранят данных о состоянии
services.AddScoped<...>();
для каждого запроса создается свой объект сервиса. То есть если в течение одного запроса есть несколько обращений к одному сервису, то при всех этих обращениях будет использоваться один и тот же объект сервиса.
services.AddSingleton<...>();
объект сервиса создается при первом обращении к нему, все последующие запросы используют один и тот же ранее созданный объект сервиса
Шаг 3 Передача зависимостей в контроллер
Как и любой класс, контроллер может получать сервисы приложения через механизм dependency injection.
В контроллере это можно делать следующими способами:
Через конструктор
Через параметр метода, к которому применяется атрибут FromServices
  C#  
public string Index([FromServices] ITimeService timeService)
{
return timeService.Time;
}
Через свойство HttpContext.RequestServices
  C#  
public string Index()
{
     ITimeService timeService = (ITimeService)HttpContext.RequestServices.GetService(typeof(ITimeService));
     return timeService?.Time;
}
Шаг 4 получить добавленные в приложения сервисы различными способами;
Через конструктор класса (за исключением конструктора класса Startup)
Через параметр метода Configure класса Startup
  C#  
public class Startup
{
     public void ConfigureServices(IServiceCollection services)
     {
          services.AddTransient<IMessageSender, EmailMessageSender>();
     }

     // Получаем зависимость IMessageSender
     public void Configure(IApplicationBuilder app, IMessageSender sender)
     {
          app.Run(async (context) =>
          {
               await context.Response.WriteAsync(sender.Send());
          });
     }
}
используя services.BuildServiceProvider
в методе ConfigureServices
класса Startup
  C#  
public void ConfigureServices(IServiceCollection services)
{
     ...

     // get service provider
     IServiceProvider serviceProvider = services.BuildServiceProvider();

     // get service
     IMessageSender messageSender = (IMessageSender)serviceProvider.GetService(typeof(IMessageSender));

     ...
}
Через параметр метода Invoke компонента middleware
  C#  
public class MessageMiddleware
{
     private readonly RequestDelegate _next;

     public MessageMiddleware(RequestDelegate next)
     {
          this._next = next;
     }

     public async Task Invoke(HttpContext context, IMessageSender messageSender)
     {
          context.Response.ContentType = "text/html;charset=utf-8";
          await context.Response.WriteAsync(messageSender.Send());
     }
}
Через свойство RequestServices контекста запроса HttpContext в компонентах middleware
IMessageSender messageSender = context.RequestServices.GetService();
Через свойство ApplicationServices объекта IApplicationBuilder в классе Startup
  C#  

public void Configure(IApplicationBuilder app)
{
     app.Run(async (context) =>
     {
          IMessageSender messageSender = (IMessageSender)app.ApplicationServices.GetService(typeof(IMessageSender));
          context.Response.ContentType = "text/html;charset=utf-8";
          await context.Response.WriteAsync(messageSender.Send());
     });
}
 
← Предыдущая тема
Создаем новое приложение ASP.NET Core MVC
 
Следующая тема →
Entity Framework в приложении ASP.NET Core MVC. Используем Code First (пишем c# код, а таблицы в базе данных создаются сами)
 
Ваши Отзывы ... комментарии ...
   
Вашe имя
Ваш комментарий (www ссылки может добавлять только залогиненный пользователь)

Картинки

Объявления
Объявления
.NET Core  
Что такое .NET Core ?
Создаем новое консольное приложение .NET Core
ASP.NET Core
Что такое ASP.NET Core ?
Создаем новое приложение ASP.NET Core
ASP.NET Core MVC
Создаем новое приложение ASP.NET Core MVC
Встроенный контейнер IoC в ASP.NET Core

База данных (Entity Framework) в ASP.NET Core MVC
Entity Framework в приложении ASP.NET Core MVC. Используем Code First (пишем c# код, а таблицы в базе данных создаются сами)

Telerik (Kendo UI) в ASP.NET Core MVC
Telerik (Kendo UI) в ASP.NET Core MVC (подключаем Kendo js файлы используя NPM и Webpack)

Аутентификация (login/register/logout) в приложении ASP.NET Core MVC
Аутентификация (authentication) это login/register/logout в приложении ASP.NET Core MVC
Дополнительные темы, вопросы
Инсталлируем новую версию (.NET 6.0) для Visual Studio 2022. На заметку! .NET 6.0 не устанавливается и не работает для Visual Studio 2019
Инсталлируем новую версию (.NET Core 2.2) для Visual Studio 2019
Выбор между ASP.NET Core и ASP.NET ?
Перенос кода в .NET Core из .NET Framework
Error "unable to connect to web server "iis express" | ASP.NET Core | Visual Studio 2017
Error "This site can't be reached" when run ASP.NET Core application | Solution: Recreate the Self-Signed HTTPS Certificate for localhost in IIS Express
WWW сайты для изучения
Сайты для изучения ASP.NET Core

  Ваши вопросы присылайте по почте: info@dir.by  
Яндекс.Метрика