方法 1 - 注入一个状态提供者
- 创建一个类型来存储数据。
- 使用接口对其进行抽象,因此您可以根据需要注入不同的提供程序(例如,用于测试)。
- 消费类不关心实现,除了它保证有状态。
- 并发字典负责线程安全。
public interface IStateProvider
{
void Store( string key, object value );
object Get( string key );
}
public class StateProvider : IStateProvider
{
private static ConcurrentDictionary<string, object> _storage = new ConcurrentDictionary<string, object>();
public void Store( string key, object value )
{
// add to storage
}
public object Get( string key )
{
// get from storage
}
}
public class Forest<T1, T2>
{
private IStateProvider _stateProvider;
public Forest( IStateProvider stateProvider )
{
_stateProvider = stateProvider;
}
public void Foo()
{
// do something with the stateful value
}
}
// of course, you could do this with a DI framework
var stateProvider = new StateProvider();
var forest = new Forest<Foo, Bar>( stateProvider );
方法 2 - 基类
这种方法不太优雅,但更简单一些。
public abstract class ForestBase
{
private static List<object> _staticList = new List<object>();
protected List<object> StaticList
{
get { return _staticList; }
}
}
public class Forest<T1, T2> : ForestBase
{
public void Foo()
{
StaticList.Add( 12345 );
}
}
这隐藏了内部数据,应该只给你一个静态列表的实例,而不是每个通用参数组合一个实例。