为MVC最佳实践定义存储库

时间:2014-01-23 15:07:44

标签: asp.net-mvc static singleton repository

我希望为我的所有类/实体提供一个存储库。来自MVC应用程序的所有控制器都应该能够使用此存储库而无需创建新实例。存储库必须具有提取的接口,用于测试或其他目的 - 因此存储库类不是静态的,因为静态类不能实现接口。然而,它将具有静态属性,该属性将在不实例化Repository类的情况下可用。构造函数可能是冗余的或由方法替换。如果这是一个很好的实施或不好的做法,请告诉我。或者让我知道是否可以某种方式改进:

 public class Repository : IRepository
 {
    private MyDBContext context;

    private static Repository _instance;
    public static Repository Instance
    {
        get
        {
            if(_instance == null)
            {
                _instance = new Repository(new MyDBContext());
            }
            return _instance;
        }            
    }

    public Repository(MyDBContext context)
    {
        this.context = context;     
        if(_instance == null)
        {
            _instance = new Repository(context);
        }
    }

    ...

}

1 个答案:

答案 0 :(得分:1)

你的建议没有任何技术上的错误。虽然有一些改进。 静态构造函数保证在第一次调用静态成员之前只运行一次。因此,当2方法调用您的Instance属性时,您将删除代码中的竞争条件。构造函数中的空合并运算符意味着您将获得默认实现,但您可以覆盖它以进行测试。

public class Repository : IRepository
{
    private MyDBContext context;

    public static IRepository Instance
    {
        get;
        private set;            
    }

    static Repository()
    {
        Instance = new Repository(null);
    }

    public Repository(MyDBContext context)
    {
        this.context = context ?? new MyDBContext();    
    }
}