Создать новый экземпляр класса при вызове метода - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть консольное приложение, которое внедряет все сервисы через конструктор. Я также создаю и инициализирую словарь в конструкторе моего класса доступа к данным.

Я вызываю метод доступа к данным из моего основного класса, но я хотел создать новый экземпляр класса доступа к данным и, следовательно, словарь всякий раз, когда я вызываю метод GetData ().

public class Startup
{
    private static void Main(string[] args)
    {            
        ServiceCollection serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);
        IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
        serviceProvider.GetService<MyService>().Start();
    }

    private static void ConfigureServices(IServiceCollection serviceCollection)
    {
        serviceCollection.AddTransient<IMyServiceDataAccess, MyServiceDataAccess>();
        serviceCollection.AddTransient<MyService>();
    }
 }

MyServiceClass:

private readonly IMyServiceDataAccess _dataAccess;
public MyService(IMyServiceDataAccess dataAccess)
{
    _dataAccess = dataAccess;
}

public void Start()
{
     var data = _dataAccess.GetData();
}

Интерфейс DataAccess

открытый интерфейс IMyServiceDataAccess { List GetData (); }

Класс DataAccess:

Dictionary<bool,List<int> dict;
public MyServiceDataAccess()
{
    dict = new Dictionary<bool,List<int>>()
}

public List<int> GetData()
{
    // have to access the above dict and everytime I need new instance 
    // of this dict
}

Это многопоточное приложение, поэтому несколько потоков могут совместно использовать словарь. Одним из способов является то, что я создаю новый экземпляр словаря в методе get data каждый раз, когда он вызывается.

Ответы [ 2 ]

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

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

Вы можете использовать ObjectCache для этого. Пример:

private ObjectCache cache = MemoryCache.Default;

public MyServiceDataAccess()
{

}

public List<int> GetData()
{
    string data = cache["someKey"] as List<int>;

    if (data == null)
    {
        //fetch the actual data
        data = GetMyData();
        cache.Set("someKey", data);
    }

    return data
}
0 голосов
/ 23 апреля 2019

Поскольку вы упомянули, что хотите, чтобы ваш Dictionary<bool, List<int>> объект был открыт для общего доступа, я предполагаю, что вы не намеревались внедрить MyServiceDataAccess в качестве временного объекта.Либо создайте словарь для объекта static, либо вставьте его как Singleton ниже.

private static void ConfigureServices(IServiceCollection serviceCollection)
{
    serviceCollection.AddTransient<IMyServiceDataAccess, MyServiceDataAccess>();
    serviceCollection.AddSingleton<MyService>();
}

То, нужно ли вам это делать, зависит от уровня данных, например, EntityFrameworkCore рекомендует вводить DbContexts с временем жизни Scoped .

. В этот момент вы можете обновить свой метод GetData, чтобы повторно инициализировать Dictionary в его вызове метода .... но у вас есть несколько потоковкоторый может вызывать этот метод одновременно, и если ваш Dictionary равен static или вы используете Singleton, у вас возникнут проблемы с изменением Dictionary и попыткой его использоватьчерез разные темы.Вместо этого вы можете использовать ConcurrentDictionary , который является поточно-ориентированным.Однако зачем вам нужно делиться этим Dictionary между потоками, если вы все равно просто инициализируете его при каждом вызове?Единственные ответы, которые дадут вам запрошенное решение, будут иметь ненадежный Dictionary, или вам придется отстранить ваш GetData вызов и отменить любую точку в совместном использовании Dictionary для начала.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...