将数据库初始化调用放入C#构造函数中可以吗?
我见过这是各种代码库,并想知道这是否通常皱眉或不。将数据库初始化调用放入C#构造函数中可以吗?
例如:
public class MyClass
{
public int Id;
public MyClass()
{
Id = new Database().GetIdFor(typeof(MyClass));
}
}
有几个原因,这是不通常被认为是很好的设计,其中一些像导致难以进行单元测试和处理错误的难度已经被提及。
主要的原因我会选择不这样做是你的对象和数据访问层现在非常紧耦合的,这意味着任何使用它之外的物体的原始设计要求显著返工。举一个例子,如果你碰到一个实例,你需要使用那个对象而没有赋值任何值来持久化该类的一个新实例?你现在要么必须重载构造函数,然后确保所有其他的逻辑处理这个新的情况,要么继承并覆盖。
如果对象和数据访问进行了分离,那么你可以创建一个实例,然后不喝水吧。或者,如果您有一个使用相同实体但使用不同持久层的不同项目,则这些对象是可重用的。
说了这么多我已连接的路径更容易在项目过去:)
我能想到的这种方法是从数据库初始化的任何错误都会被传播从构造异常的唯一问题。
嗯..我不会。但是我的方法再次涉及到类不负责检索自己的数据。
是啊,你能做到这一点,但它不是最好的设计,以及错误处理的构造并不像整齐的其他地方。
,如果你是指一个数据库连接可以使用一次性模式:
public class MyClass : IDisposable
{
private Database db;
private int? _id;
public MyClass()
{
db = new Database();
}
public int Id
{
get
{
if (_id == null) _id = db.GetIdFor(typeof(MyClass));
return _id.Value;
}
}
public void Dispose()
{
db.Close();
}
}
用法:
using (var x = new MyClass())
{
/* ... */
} //closes DB by calling IDisposable.Dispose() when going out of "using" scope
为什么会有人想使用一个模拟对象/存根,而不是真实的东西? 您是否同意汽车制造商应该使用纸板模型 进行碰撞测试?
对于集成测试,您绝对使用完整的图层。对于一个单元测试,你只是想验证你的对象调用它所说的。您可以使用其他单元或集成测试来验证其资源是否按照他们的说法进行操作。 – 2011-08-01 15:03:22
“说到这我已连接的路径更容易在项目过去:)”我喜欢,表明这方面是非常重要的。 – Sully 2017-08-02 13:37:02