我希望为我的所有类/实体提供一个存储库。来自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);
}
}
...
}
答案 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();
}
}