ASP.NET Core'daki denetleyicilere bağımlılık ekleme

Shadi Alnamrouti ve Rick Anderson tarafından

ASP.NET Core MVC denetleyicileri, oluşturucular aracılığıyla bağımlılıkları açıkça istemektedir. ASP.NET Core, bağımlılık ekleme (DI) için yerleşik desteğe sahiptir. DI, uygulamaların test ve bakımlarını kolaylaştırır.

Örnek kodu görüntüleme veya indirme (indirme)

Oluşturucu ekleme

Hizmetler bir oluşturucu parametresi olarak eklenir ve çalışma zamanı hizmeti hizmet kapsayıcısından çözümler. Hizmetler genellikle arabirimler kullanılarak tanımlanır. Örneğin, geçerli saati gerektiren bir uygulamayı düşünün. Aşağıdaki arabirim hizmeti kullanıma sunar IDateTime :

public interface IDateTime
{
    DateTime Now { get; }
}

Aşağıdaki kod arabirimini IDateTime uygular:

public class SystemDateTime : IDateTime
{
    public DateTime Now
    {
        get { return DateTime.Now; }
    }
}

Hizmeti hizmet kapsayıcısına ekleyin:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();

    services.AddControllersWithViews();
}

hakkında AddSingletondaha fazla bilgi için bkz . DI hizmet ömrü.

Aşağıdaki kod, kullanıcıya günün saatine göre bir selamlama görüntüler:

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();
    }

Uygulamayı çalıştırdığınızda saate göre bir ileti görüntülenir.

ile eylem ekleme FromServices

oluşturucu FromServicesAttribute eklemesi kullanmadan bir hizmeti doğrudan bir eylem yöntemine eklemeye olanak tanır:

public IActionResult About([FromServices] IDateTime dateTime)
{
    return Content( $"Current server time: {dateTime.Now}");
}

ile eylem ekleme FromKeyedServices

Aşağıdaki kod, özniteliğini kullanarak DI kapsayıcısından anahtarlı hizmetlere nasıl erişilir gösterilmektedir [FromKeyedServices] :

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");
    }
}

Denetleyiciden erişim ayarları

Uygulama veya yapılandırma ayarlarına bir denetleyici içinden erişmek yaygın bir düzendir. ayarları yönetmek için tercih edilen yaklaşım, ASP.NET Core'daki Seçenekler düzeni bölümünde açıklanan seçenekler desenidir. Genel olarak, doğrudan bir denetleyiciye eklemeyin IConfiguration .

Seçenekleri temsil eden bir sınıf oluşturun. Örneğin:

public class SampleWebSettings
{
    public string Title { get; set; }
    public int Updates { get; set; }
}

Yapılandırma sınıfını hizmetler koleksiyonuna ekleyin:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();
    services.Configure<SampleWebSettings>(Configuration);

    services.AddControllersWithViews();
}

Uygulamayı JSON biçimli bir dosyadan ayarları okuyacak şekilde yapılandırın:

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>();
            });
}

Aşağıdaki kod, hizmet kapsayıcısından ayarları istemektedir IOptions<SampleWebSettings> ve bunları yönteminde Index kullanır:

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();
    }
}

Ek kaynaklar

Shadi Alnamrouti, Rick Anderson ve Steve Smith tarafından

ASP.NET Core MVC denetleyicileri, oluşturucular aracılığıyla bağımlılıkları açıkça istemektedir. ASP.NET Core, bağımlılık ekleme (DI) için yerleşik desteğe sahiptir. DI, uygulamaların test ve bakımlarını kolaylaştırır.

Örnek kodu görüntüleme veya indirme (indirme)

Oluşturucu ekleme

Hizmetler bir oluşturucu parametresi olarak eklenir ve çalışma zamanı hizmeti hizmet kapsayıcısından çözümler. Hizmetler genellikle arabirimler kullanılarak tanımlanır. Örneğin, geçerli saati gerektiren bir uygulamayı düşünün. Aşağıdaki arabirim hizmeti kullanıma sunar IDateTime :

public interface IDateTime
{
    DateTime Now { get; }
}

Aşağıdaki kod arabirimini IDateTime uygular:

public class SystemDateTime : IDateTime
{
    public DateTime Now
    {
        get { return DateTime.Now; }
    }
}

Hizmeti hizmet kapsayıcısına ekleyin:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();

    services.AddControllersWithViews();
}

hakkında AddSingletondaha fazla bilgi için bkz . DI hizmet ömrü.

Aşağıdaki kod, kullanıcıya günün saatine göre bir selamlama görüntüler:

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();
    }

Uygulamayı çalıştırdığınızda saate göre bir ileti görüntülenir.

ile eylem ekleme FromServices

oluşturucu FromServicesAttribute eklemesi kullanmadan bir hizmeti doğrudan bir eylem yöntemine eklemeye olanak tanır:

public IActionResult About([FromServices] IDateTime dateTime)
{
    return Content( $"Current server time: {dateTime.Now}");
}

Denetleyiciden erişim ayarları

Uygulama veya yapılandırma ayarlarına bir denetleyici içinden erişmek yaygın bir düzendir. ayarları yönetmek için tercih edilen yaklaşım, ASP.NET Core'daki Seçenekler düzeni bölümünde açıklanan seçenekler desenidir. Genel olarak, doğrudan bir denetleyiciye eklemeyin IConfiguration .

Seçenekleri temsil eden bir sınıf oluşturun. Örneğin:

public class SampleWebSettings
{
    public string Title { get; set; }
    public int Updates { get; set; }
}

Yapılandırma sınıfını hizmetler koleksiyonuna ekleyin:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();
    services.Configure<SampleWebSettings>(Configuration);

    services.AddControllersWithViews();
}

Uygulamayı JSON biçimli bir dosyadan ayarları okuyacak şekilde yapılandırın:

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>();
            });
}

Aşağıdaki kod, hizmet kapsayıcısından ayarları istemektedir IOptions<SampleWebSettings> ve bunları yönteminde Index kullanır:

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();
    }
}

Ek kaynaklar

Shadi Namrouti, Rick Anderson ve Steve Smith

ASP.NET Core MVC denetleyicileri, oluşturucular aracılığıyla bağımlılıkları açıkça istemektedir. ASP.NET Core, bağımlılık ekleme (DI) için yerleşik desteğe sahiptir. DI, uygulamaların test ve bakımlarını kolaylaştırır.

Örnek kodu görüntüleme veya indirme (indirme)

Oluşturucu ekleme

Hizmetler bir oluşturucu parametresi olarak eklenir ve çalışma zamanı hizmeti hizmet kapsayıcısından çözümler. Hizmetler genellikle arabirimler kullanılarak tanımlanır. Örneğin, geçerli saati gerektiren bir uygulamayı düşünün. Aşağıdaki arabirim hizmeti kullanıma sunar IDateTime :

public interface IDateTime
{
    DateTime Now { get; }
}

Aşağıdaki kod arabirimini IDateTime uygular:

public class SystemDateTime : IDateTime
{
    public DateTime Now
    {
        get { return DateTime.Now; }
    }
}

Hizmeti hizmet kapsayıcısına ekleyin:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

hakkında AddSingletondaha fazla bilgi için bkz . DI hizmet ömrü.

Aşağıdaki kod, kullanıcıya günün saatine göre bir selamlama görüntüler:

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();
    }

Uygulamayı çalıştırdığınızda saate göre bir ileti görüntülenir.

ile eylem ekleme FromServices

oluşturucu FromServicesAttribute eklemesi kullanmadan bir hizmeti doğrudan bir eylem yöntemine eklemeye olanak tanır:

public IActionResult About([FromServices] IDateTime dateTime)
{
    ViewData["Message"] = $"Current server time: {dateTime.Now}";

    return View();
}

Denetleyiciden erişim ayarları

Uygulama veya yapılandırma ayarlarına bir denetleyici içinden erişmek yaygın bir düzendir. ayarları yönetmek için tercih edilen yaklaşım, ASP.NET Core'daki Seçenekler düzeni bölümünde açıklanan seçenekler desenidir. Genel olarak, doğrudan bir denetleyiciye eklemeyin IConfiguration .

Seçenekleri temsil eden bir sınıf oluşturun. Örneğin:

public class SampleWebSettings
{
    public string Title { get; set; }
    public int Updates { get; set; }
}

Yapılandırma sınıfını hizmetler koleksiyonuna ekleyin:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IDateTime, SystemDateTime>();
    services.Configure<SampleWebSettings>(Configuration);
    
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Uygulamayı JSON biçimli bir dosyadan ayarları okuyacak şekilde yapılandırın:

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>();
}

Aşağıdaki kod, hizmet kapsayıcısından ayarları istemektedir IOptions<SampleWebSettings> ve bunları yönteminde Index kullanır:

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();
    }
}

Ek kaynaklar