Разница между статическим полем и введенным синглтоном в контроллере? - PullRequest
0 голосов
/ 03 апреля 2019

В чем разница между статическим полем Dictionary, полем (статическим или нестатическим?) ConcurrentDictionary и одноэтапной службой, зависимой от внедренных в контроллере в ASP.NET Core?

Статический словарь.

public class HomeController : Controller
{
    private static IDictionary<string, string> _dictionary =
        new Dictionary<string, string>();
}

A (статический или нестатический?) ConcurrentDictionary.

public class HomeController : Controller
{
    private IDictionary<string, string> _dictionary =
        new ConcurrentDictionary<string, string>();
}

Свойство Dictionary внутри одноэтапной службы с зависимостью.

// Startup.cs
services.AddSingleton<HomeService>(); // Dependency injection

// HomeService.cs
public class HomeService
{
    public IDictionary<string, string> MyDictionary { get; set; } =
        new Dictionary<string, string>();
}

// HomeController.cs
public class HomeController : Controller
{
    private HomeService _service;

    public HomeController(HomeService service)
    {
        _service = service;
    }

    public IActionResult Index()
    {
        _service.MyDictionary.Add("foo", "bar");
        return Ok();
    }
}

В чем разница? Чем они отличаются друг от друга? Любой подход предпочтительнее другого?

1 Ответ

0 голосов
/ 10 апреля 2019

Как указывает jpgrassi в комментарии, наличие статического поля внутри контроллера не очень хорошая идея, поскольку оно не масштабируется в нескольких экземплярах приложения, работающего за балансировщиком нагрузки.

Правильный способ сделать это в ASP.NET Core - использовать распределенное кэширование с интерфейсом IDistributedCache, который допускает различные реализации, такие как в памяти или Redis и т. Д.

public class HomeController : Controller
{
    private readonly IDistributedCache _cache;

    public HomeController(IDistributedCache cache)
    {
        _cache = cache;
    }

    public Task<IActionResult> Index()
    {
        var currentTimeUTC = DateTime.UtcNow.ToString();
        byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
        var options = new DistributedCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromSeconds(20));
        await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);

        return Ok();
    }
}
...