程序集“ A”提供了有价值的类,该类提供了静态属性。

class ValuableClass
{
  public static string MyProperty { get; set; }
}


程序集“ B”和“ C”使用ValuableClass及其静态属性。一切正常,直到在同一过程中加载“ B”和“ C”。

我应该如何重构MyStaticProperty实现以使“ B”和“ C”调用保持隔离?我不能依赖线程ID(多个线程可能会更改每个程序集的静态属性),而且我也不能依赖进程ID,因为它是同一进程。

我想简化的代码应该如下所示,但是我不确定这是最佳实践

protected static IDictionary<string, string> MyProperties
public static string MyProperty
{
  set {
     string key = Assembly.GetCallingAssembly().FullName
     MyProperties[key] = value;
  }
  get {
     string key = Assembly.GetCallingAssembly().FullName
     return MyProperties[key];
  }
}

最佳答案

不要使用静态属性:

class ValuableClass
{
    public string MyProperty { get; set; }
}


现在,BC都可以创建ValuableClass的单独实例。



现在,我们如何使所有B和C都可以访问这些实例? “干净”的方法是在整个B和C中使用依赖项注入,但是这对于大型遗留项目可能不可行。

作为一个简单的解决方案,BC可以通过静态属性使它们的ValuableClass实例可用:

class SomeClassInB
{
     private static readonly ValuableClass myValuableStuff = new ValuableClass();
     public static ValuableClass MyValuableStuff { get { return myValuableStuff; } }
}

// same for C


由于SomeClassInBSomeClassInC只能分别在BC中访问,因此,一个程序集不会“污染”另一个程序的数据。

关于c# - 区分两个引用静态属性的调用程序集的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28629701/

10-10 13:47