Могу ли я хранить неразборчивый объект между запросами? - PullRequest
0 голосов
/ 20 сентября 2019

Я создал проект .NET Core API.Это работает, но создает новый объект для каждого get запроса.Где я могу сохранить объект, чтобы использовать его повторно?Я искал в Google и обнаружил Session, но в нем хранятся только байты или сериализованные байтыЯ не думаю, что могу сериализовать объект.

Если doSomeInitialisation() занимает 1 секунду, создание нового SomeLibrary при каждом запросе get, когда arg1 одинаково, не кажется эффективным иSomeLibrary не является сериализуемым, поэтому его нельзя сохранить в Session.

[HttpGet("{arg1}/{arg2}")]
public IActionResult Get(string arg1, string arg2)
{
    var someLibrary = new SomeLibrary();
    someLibrary.doSomeInitialisation(arg1);

    return someLibrary.doSomething(arg2);
}

Запросах

  • httpx: //..../dog/1
  • httpx: //..../dog/2
  • httpx: //..../dog/3
  • httpx: //..../cat/ 1
  • httpx: //..../cat/2

Я мог бы повторно использовать один и тот же объект SomeLibrary для первых трех запросов.

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Полагаю, вы используете DI в своем проекте.Прежде всего, прочитайте эту статью Внедрение зависимостей в ASP.NET Core .Тогда вы поймете, что вы можете использовать следующий код для регистрации только одного экземпляра для приложения:

//Startup.cs
services.AddSingleton<ISomeLibrary>(new SomeLibrary());

....

//controller
public SomeController : Controller
{
    private readonly ISomeLibrary _sl;

    public SomeController(ISomeLibrary sl)
    {
        _sl = sl;
    }

    ...
}

ОБНОВЛЕНИЕ:

Согласно вашему последнему комментарию вы можете реализоватьэто так:

public interface ISmthResolver
{
    ISomeLibrary Get(string arg);
}

...

public class SmthResolver : ISmthResolver
{
    private readonly ConcurrentDictionary<string, Lazy<ISomeLibrary>> _instances = new ConcurrentDictionary<string, Lazy<ISomeLibrary>>();

    public ISomeLibrary Get(string arg) => _instances.GetOrAdd(arg, key => new Lazy<ISomeLibrary>(() => new SomeLibrary())).Value;
}

...

services.AddSingleton<SmthResolver, ISmthResolver>();

...

public class Some
{
    public Some(ISmthResolver sr)
    {
        var sl = sr.Get("arg");
    }
}

Также прочитайте это Обеспечение безопасности потока ConcurrentDictionary GetOrAdd с использованием Lazy .

0 голосов
/ 20 сентября 2019

Вы можете примерить одноэлементный шаблон, но вы должны учитывать, что если он соответствует вашим требованиям, потому что одноэлементный шаблон не подходит для всех классов.

 public class Singleton
    {
        private static string _locker = new object();
        private static Singleton _instance = null;
        public string SerializedString="";

        ///Constructore is called just one time !
        public Singleton(arg1){
         DoSerialization(arg1);
         }
        public static Singleton Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_locker)
                    {
                        if (_instance == null)
                        {
                            _instance = new Singleton();
                        }
                    }
                }
                return _instance;
            }
        }
    private void DoSerialization(arg1){
      this.SerializedString=JsonConvert.SerializeObject(arg1)
     }
    }

и использовать его вот так

var SameInstance=new Singleton(arg1).Instance;
var serialized=SameInstance.SerializedString;
...