Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Por Shadi Alnamrouti e Rick Anderson
ASP.NET controladores MVC principais solicitam dependências explicitamente por meio de construtores. ASP.NET Core tem suporte integrado para injeção de dependência (DI). O DI torna os aplicativos mais fáceis de testar e manter.
Visualizar ou descarregar amostra de código (como descarregar)
Injeção por construtor
Os serviços são adicionados como um parâmetro do construtor e o tempo de execução resolve o serviço a partir do contentor de serviços. Os serviços são normalmente definidos usando interfaces. Por exemplo, considere um aplicativo que exija a hora atual. A interface a seguir expõe o IDateTime serviço:
public interface IDateTime
{
DateTime Now { get; }
}
O código a seguir implementa a IDateTime interface:
public class SystemDateTime : IDateTime
{
public DateTime Now
{
get { return DateTime.Now; }
}
}
Adicione o serviço ao contêiner de serviço:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IDateTime, SystemDateTime>();
services.AddControllersWithViews();
}
Para obter mais informações sobre AddSingleton, consulte Ciclos de vida do serviço DI.
O código a seguir exibe uma saudação ao usuário com base na hora do dia:
public class HomeController : Controller
{
private readonly IDateTime _dateTime;
public HomeController(IDateTime dateTime)
{
_dateTime = dateTime;
}
public IActionResult Index()
{
var serverTime = _dateTime.Now;
if (serverTime.Hour < 12)
{
ViewData["Message"] = "It's morning here - Good Morning!";
}
else if (serverTime.Hour < 17)
{
ViewData["Message"] = "It's afternoon here - Good Afternoon!";
}
else
{
ViewData["Message"] = "It's evening here - Good Evening!";
}
return View();
}
Execute o aplicativo e uma mensagem é exibida com base no tempo.
Injeção de ação com FromServices
O FromServicesAttribute permite injetar um serviço diretamente em um método de ação sem usar a injeção do construtor:
public IActionResult About([FromServices] IDateTime dateTime)
{
return Content( $"Current server time: {dateTime.Now}");
}
Injeção de ação com FromKeyedServices
O código a seguir mostra como acessar serviços com chave do contêiner DI usando o [FromKeyedServices] atributo:
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddKeyedSingleton<ICache, BigCache>("big");
builder.Services.AddKeyedSingleton<ICache, SmallCache>("small");
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();
public interface ICache
{
object Get(string key);
}
public class BigCache : ICache
{
public object Get(string key) => $"Resolving {key} from big cache.";
}
public class SmallCache : ICache
{
public object Get(string key) => $"Resolving {key} from small cache.";
}
[ApiController]
[Route("/cache")]
public class CustomServicesApiController : Controller
{
[HttpGet("big")]
public ActionResult<object> GetBigCache([FromKeyedServices("big")] ICache cache)
{
return cache.Get("data-mvc");
}
[HttpGet("small")]
public ActionResult<object> GetSmallCache([FromKeyedServices("small")] ICache cache)
{
return cache.Get("data-mvc");
}
}
Aceder às definições a partir de um controlador
Aceder a definições de aplicação ou configuração a partir de um controlador é um padrão comum. O padrão de opções descrito em Padrão de opções no ASP.NET Core é a abordagem preferida para gerenciar configurações. Geralmente, não injete IConfiguration diretamente em um controlador.
Crie uma classe que represente as opções. Por exemplo:
public class SampleWebSettings
{
public string Title { get; set; }
public int Updates { get; set; }
}
Adicione a classe de configuração à coleção de serviços:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IDateTime, SystemDateTime>();
services.Configure<SampleWebSettings>(Configuration);
services.AddControllersWithViews();
}
Configure o aplicativo para ler as configurações de um arquivo formatado em JSON:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("samplewebsettings.json",
optional: false,
reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
O código a seguir solicita as IOptions<SampleWebSettings> configurações do contêiner de serviço e as usa no Index método:
public class SettingsController : Controller
{
private readonly SampleWebSettings _settings;
public SettingsController(IOptions<SampleWebSettings> settingsOptions)
{
_settings = settingsOptions.Value;
}
public IActionResult Index()
{
ViewData["Title"] = _settings.Title;
ViewData["Updates"] = _settings.Updates;
return View();
}
}
Recursos adicionais
- Consulte Testar lógica do controlador no ASP.NET Core para saber como tornar o código mais fácil de testar solicitando explicitamente dependências em controladores.
- Suporte ao contentor de injeção de dependência de serviço com chave
- Substitua o contêiner de injeção de dependência padrão por uma implementação de terceiros.
Por Shadi Alnamrouti, Rick Anderson e Steve Smith
ASP.NET controladores MVC principais solicitam dependências explicitamente por meio de construtores. ASP.NET Core tem suporte integrado para injeção de dependência (DI). O DI torna os aplicativos mais fáceis de testar e manter.
Visualizar ou descarregar amostra de código (como descarregar)
Injeção por construtor
Os serviços são adicionados como um parâmetro do construtor e o tempo de execução resolve o serviço a partir do contentor de serviços. Os serviços são normalmente definidos usando interfaces. Por exemplo, considere um aplicativo que exija a hora atual. A interface a seguir expõe o IDateTime serviço:
public interface IDateTime
{
DateTime Now { get; }
}
O código a seguir implementa a IDateTime interface:
public class SystemDateTime : IDateTime
{
public DateTime Now
{
get { return DateTime.Now; }
}
}
Adicione o serviço ao contêiner de serviço:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IDateTime, SystemDateTime>();
services.AddControllersWithViews();
}
Para obter mais informações sobre AddSingleton, consulte Ciclos de vida do serviço DI.
O código a seguir exibe uma saudação ao usuário com base na hora do dia:
public class HomeController : Controller
{
private readonly IDateTime _dateTime;
public HomeController(IDateTime dateTime)
{
_dateTime = dateTime;
}
public IActionResult Index()
{
var serverTime = _dateTime.Now;
if (serverTime.Hour < 12)
{
ViewData["Message"] = "It's morning here - Good Morning!";
}
else if (serverTime.Hour < 17)
{
ViewData["Message"] = "It's afternoon here - Good Afternoon!";
}
else
{
ViewData["Message"] = "It's evening here - Good Evening!";
}
return View();
}
Execute o aplicativo e uma mensagem é exibida com base no tempo.
Injeção de ação com FromServices
O FromServicesAttribute permite injetar um serviço diretamente em um método de ação sem usar a injeção do construtor:
public IActionResult About([FromServices] IDateTime dateTime)
{
return Content( $"Current server time: {dateTime.Now}");
}
Aceder às definições a partir de um controlador
Aceder a definições de aplicação ou configuração a partir de um controlador é um padrão comum. O padrão de opções descrito em Padrão de opções no ASP.NET Core é a abordagem preferida para gerenciar configurações. Geralmente, não injete IConfiguration diretamente em um controlador.
Crie uma classe que represente as opções. Por exemplo:
public class SampleWebSettings
{
public string Title { get; set; }
public int Updates { get; set; }
}
Adicione a classe de configuração à coleção de serviços:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IDateTime, SystemDateTime>();
services.Configure<SampleWebSettings>(Configuration);
services.AddControllersWithViews();
}
Configure o aplicativo para ler as configurações de um arquivo formatado em JSON:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("samplewebsettings.json",
optional: false,
reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
O código a seguir solicita as IOptions<SampleWebSettings> configurações do contêiner de serviço e as usa no Index método:
public class SettingsController : Controller
{
private readonly SampleWebSettings _settings;
public SettingsController(IOptions<SampleWebSettings> settingsOptions)
{
_settings = settingsOptions.Value;
}
public IActionResult Index()
{
ViewData["Title"] = _settings.Title;
ViewData["Updates"] = _settings.Updates;
return View();
}
}
Recursos adicionais
Consulte Testar lógica do controlador no ASP.NET Core para saber como tornar o código mais fácil de testar solicitando explicitamente dependências em controladores.
Substitua o contêiner de injeção de dependência padrão por uma implementação de terceiros.
ASP.NET controladores MVC principais solicitam dependências explicitamente por meio de construtores. ASP.NET Core tem suporte integrado para injeção de dependência (DI). O DI torna os aplicativos mais fáceis de testar e manter.
Visualizar ou descarregar amostra de código (como descarregar)
Injeção por construtor
Os serviços são adicionados como um parâmetro do construtor e o tempo de execução resolve o serviço a partir do contentor de serviços. Os serviços são normalmente definidos usando interfaces. Por exemplo, considere um aplicativo que exija a hora atual. A interface a seguir expõe o IDateTime serviço:
public interface IDateTime
{
DateTime Now { get; }
}
O código a seguir implementa a IDateTime interface:
public class SystemDateTime : IDateTime
{
public DateTime Now
{
get { return DateTime.Now; }
}
}
Adicione o serviço ao contêiner de serviço:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IDateTime, SystemDateTime>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Para obter mais informações sobre AddSingleton, consulte Ciclos de vida do serviço DI.
O código a seguir exibe uma saudação ao usuário com base na hora do dia:
public class HomeController : Controller
{
private readonly IDateTime _dateTime;
public HomeController(IDateTime dateTime)
{
_dateTime = dateTime;
}
public IActionResult Index()
{
var serverTime = _dateTime.Now;
if (serverTime.Hour < 12)
{
ViewData["Message"] = "It's morning here - Good Morning!";
}
else if (serverTime.Hour < 17)
{
ViewData["Message"] = "It's afternoon here - Good Afternoon!";
}
else
{
ViewData["Message"] = "It's evening here - Good Evening!";
}
return View();
}
Execute o aplicativo e uma mensagem é exibida com base no tempo.
Injeção de ação com FromServices
O FromServicesAttribute permite injetar um serviço diretamente em um método de ação sem usar a injeção do construtor:
public IActionResult About([FromServices] IDateTime dateTime)
{
ViewData["Message"] = $"Current server time: {dateTime.Now}";
return View();
}
Aceder às definições a partir de um controlador
Aceder a definições de aplicação ou configuração a partir de um controlador é um padrão comum. O padrão de opções descrito em Padrão de opções no ASP.NET Core é a abordagem preferida para gerenciar configurações. Geralmente, não injete IConfiguration diretamente em um controlador.
Crie uma classe que represente as opções. Por exemplo:
public class SampleWebSettings
{
public string Title { get; set; }
public int Updates { get; set; }
}
Adicione a classe de configuração à coleção de serviços:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IDateTime, SystemDateTime>();
services.Configure<SampleWebSettings>(Configuration);
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Configure o aplicativo para ler as configurações de um arquivo formatado em JSON:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("samplewebsettings.json",
optional: false, // File is not optional.
reloadOnChange: false);
})
.UseStartup<Startup>();
}
O código a seguir solicita as IOptions<SampleWebSettings> configurações do contêiner de serviço e as usa no Index método:
public class SettingsController : Controller
{
private readonly SampleWebSettings _settings;
public SettingsController(IOptions<SampleWebSettings> settingsOptions)
{
_settings = settingsOptions.Value;
}
public IActionResult Index()
{
ViewData["Title"] = _settings.Title;
ViewData["Updates"] = _settings.Updates;
return View();
}
}
Recursos adicionais
Consulte Testar lógica do controlador no ASP.NET Core para saber como tornar o código mais fácil de testar solicitando explicitamente dependências em controladores.
Substitua o contêiner de injeção de dependência padrão por uma implementação de terceiros.