区分引用静态属性的两个调用程序集的最佳方法

use*_*691 1 .net c#

程序集"A"提供了提供静态属性的有价值的类...

class ValuableClass
{
  public static string MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

程序集"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];
  }
}
Run Code Online (Sandbox Code Playgroud)

Hei*_*nzi 5

不要使用静态属性:

class ValuableClass
{
    public string MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,这两个BC可以创建一个单独的实例ValuableClass.


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

作为一个简单的解决方案,B以及C可以使它们的实例ValuableClass通过静态属性可供选择:

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

// same for C
Run Code Online (Sandbox Code Playgroud)

由于SomeClassInB并且SomeClassInC分别只能在B和中访问C,因此不存在一个程序集"污染"另一个数据的风险.