我整天用谷歌搜索了这一天,并没有找到答案。这似乎是一个如此简单的话题,它可能会在某个地方,但也许我正在寻找错误......但请原谅我,如果这是重复...
目前,在项目中,所有数据访问级别对象都由部分类中的方法初始化。所以它是创建的,全面使用空值,然后我们在其上调用自定义get方法,其中包含一些变体:
public MyObject GetMyObjectByID(int myPrimaryKey)
{
using (var db = new myContext())
{
MyObject myObject = new MyObject();
myObject = db.MyObjects.Find(myObject.primaryKey = myPrimaryKey);
return myObject;
}
}
...并将创建的MyObject分配给初始对象。
这样有用......但似乎有很多乱跑。如果find()如此简单,并且在主键上运行得如此顺利,那么应该有办法将它放在构造函数中吗?只需使用
创建对象MyObject myObject = New MyObject(MyPrimaryKey);
就像我说的那样,我整个早上用谷歌搜索,寻找ef6的构造函数,以及带有主键的构造函数......似乎无法找到我确定的明显答案...
答案 0 :(得分:2)
不将该逻辑放在构造函数中的主要原因是因为该类已耦合到存储库。通过在类本身之外保持创建逻辑,可以将类与存储机制分离。
假设您想使用不同的存储库(比如说平面文件进行测试)。如果您的存储库访问被绑定到构造函数中,则您必须具有基于某些外部触发器选择存储库的复杂逻辑,或者使用不同的签名,因为您不能拥有具有相同签名的多个构造函数。
另外,请考虑一下构造函数的外观:
public MyObject (int pk)
{
db = // get repository
// can't say "this = ...", so we have to create a temporary object and copy.
MyObject temp = db.MyObjects.Find(myObject.primaryKey = myPrimaryKey);
// copy properties of `temp` to `this`
}