C # изменение значения поля класса для всех других классов - PullRequest
0 голосов
/ 01 июня 2018

У меня есть класс (класс A), у которого есть метод с именем methodA.

class A
{
    public Dictionary<string, double> methodA(double param1, double param2)
    {
      //do calculations
      return result;
    }

}

У меня есть 9 других классов (Class B, C, ....).У всех них есть поле с именем myField.Значение myField вычисляется с использованием метода A класса A. Они выглядят так:

class B
{
    private Dictionary<string, double> myField;
    private readonly A a = new A();
    public B()
    {
        myField = a.methodA(param1, param2)
    }
    // methods using myField    
}

param1 и param2 - это значения, которые никогда не изменяются и хранятся в другом месте.Таким образом, значение myField одинаково для всех классов и в течение всего времени выполнения приложения.Сейчас идет смена дизайна.Метод methodA обновляется и проверяет, является ли определенное условие истинным, и вычисляет значение myField на основе условия и параметров param3, param4, которые меняются во время выполнения.

public Dictionary<string, double> methodA(double param1, double param2, double param3, double param4)
{
    if(condition)
    {
        result = .....
    } else {
        result = .....
    }      
    return result;
}

условие изначально ложно и изменяется только один раз за время выполнения.После этого значение myField должно оставаться неизменным до конца времени выполнения.

Как мне реализовать это в определениях моего класса, чтобы значение myField обновлялось один раз после выполнения условия и оставалось постоянным доконец времени выполнения?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы добавили внедрение зависимостей как тег, но не используете его в своих примерах.Реализуйте его и сделайте Class A инъекционной службой (использующей интерфейс) с жизненным циклом, подобным одноэлементному, затем вы внедрите его в другие классы и вуаля, у вас везде будет один и тот же экземпляр с одинаковыми значениями.Вот как я обычно это делаю:

Container.RegisterType<IAPICacheManager, APICacheManager>(new ContainerControlledLifetimeManager());

Затем волшебным образом это передается вашим конструкторам:

public BinanceService(IAPICacheManager apiCache, string instanceName, List<object> tracking, IDataService dataService, IMapper mappingEngine) : base(instanceName, tracking)
    {
        _mappingEngine = mappingEngine;
        _dataService = dataService;

        if (apiCache != null)
        {
            _apiCache = apiCache;

            _cacheEnabled = true;
.....

Вот пример, с которого можно начать: Unity

0 голосов
/ 01 июня 2018

Если значение myField должно быть одинаковым во всех ваших классах, я бы посоветовал сделать его открытым статическим полем

...