【问题标题】:C# changing the value of a field of a class for all other classesC# 为所有其他类更改一个类的字段的值
【发布时间】:2018-06-01 11:21:58
【问题描述】:

我有一个类(A 类),它有一个名为 methodA 的方法。

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

}

我还有 9 个其他班级(B 级、C 级、....)。它们都有一个名为 myField 的字段。 myField 的值是使用 A 类的 methodA 计算出来的。它们看起来像这样:

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 被更新并检查某个条件是否为真,并根据运行时变化的条件和参数 param3、param4 计算 myField 的值。

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

条件最初为假,并且在运行时仅更改一次。之后 myField 的值应该保持不变,直到运行结束。

我应该如何在我的类定义中实现这一点,以便 myField 的值在条件为真后更新一次并保持不变直到运行结束?

【问题讨论】:

  • 你必须再次执行methodA。
  • 你可以实现一个AService,它拥有A.methodA的结果。 B 类中的 myField 从 AService.methodAResult 获取其值。
  • 您添加了 depdendency-injection 作为标签,但您没有在示例中使用它。实现它并使 Class A 成为具有像单例一样的生命周期的服务,然后将其注入到其他类中,瞧,您将在任何地方都有相同的实例,并且具有相同的值。

标签: c# dependency-injection properties


【解决方案1】:

您添加了依赖注入作为标签,但您没有在示例中使用它。实现它并使 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

【讨论】:

    【解决方案2】:

    如果 myField 的值必须在所有类中都相同,我会考虑将其设为公共静态字段

    【讨论】:

    • 完全没有错,但请记住:每个人都喜欢静态,但单元测试不喜欢!
    • 这是我实际上没有想到的,因为到目前为止还没有进行大量的单元测试,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 2013-01-10
    相关资源
    最近更新 更多