3

我想要一个像这样的课程:

public class Forest<S, T>
{
    static IList<Animal> coolGuys = new List<Animal>();
}

但我想要coolGuys真正保持静态,这意味着它必须在应用程序的整个生命周期中都是独一无二的。而现在不是。ReSharper 警告说,MS 不鼓励这种模式,但是如何才能真正实现我想要的呢?

可能我将不得不通过创建另一个静态类并在那里有一个公共静态字段另一个单例类中的公共实例字段来做更多的工作。可以有一个冗余的公共类来保存一个静态字段,但我要避免的是该字段是 public/internal。我的意思coolGuys只是为了Forest<,>,为什么要把不连贯的东西暴露给外界。

public class Forest
{
    public static IList<Animal> coolGuys = new List<Animal>(); //want to avoid
}

public class Forest<S, T>
{
    Forest.coolGuys.Add(cutie);
}

有更好的图案吗?

4

1 回答 1

8

方法 1 - 注入一个状态提供者

  1. 创建一个类型来存储数据。
  2. 使用接口对其进行抽象,因此您可以根据需要注入不同的提供程序(例如,用于测试)。
  3. 消费类不关心实现,除了它保证有状态。
  4. 并发字典负责线程安全。
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 );
    }
}

这隐藏了内部数据,应该只给你一个静态列表的实例,而不是每个通用参数组合一个实例。

于 2013-04-21T06:10:56.573 回答