这是一个奇怪的问题,但我希望有一些东西可以帮助缩短这个过程,否则我将不得不为每个项目做很多次。
我们已在办公室转向MVC,因此我们现在正在为所有对象构建“实体类”。为了强制执行某些级别的可重用性,我将实体的核心功能与数据库分开,但这对我的构造函数提出了一个特殊问题。我编写DAL文件的方式是作为一个独立的静态类(也有助于将其隐藏在外部世界中),它只返回我需要的对象......但是我必须将这些字段重新复制回到通过构造函数的类,我希望有更好的方法。
public class MyObj{
public int ID { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
public DateTime CreateDate { get; set; }
public MyObj(int prmId){
List<MyObj> raw = DAL.get(prmId);
if(raw.Count != 1)
throw new Exception("Invalid number of objects returned");
ID = raw[0].ID;
Name = raw[0].Name;
IsActive = raw[0].IsActive;
CreateDate = raw[0].CreateDate;
}
static class DAL {
public static List<MyObj> get(int? prmId){
// database stuff to call a Stored Procedure and return 0 or more MyObjs
}
}
}
我正在从raw [0]进行所有复制,是否有某种方式基本上说“this = raw [0]”?
我在许多实体中都使用相同的结构,因此非常感谢任何快捷方式。
答案 0 :(得分:1)
你犯了一些架构错误:
第一个是域模型实体必须不知道它必须如何保存/加载。因此,您已经违反了单一责任原则。您必须拥有一个存储库或其他一些处理持久性逻辑的模式。
第二个错误是,一般来说,您已经在域模型实体中引入了具体的依赖关系(DAL类被视为域模型实体中的具体类型)。这是一个糟糕的习惯,你只是违反了控制原则的反转和一般的口头代码而不是抽象而不是具体的实现&#34;规则。
答案 1 :(得分:0)
您可以使用静态 GetObject 来代替构造函数中的所有属性。
public class MyObj{
public int ID { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
public DateTime CreateDate { get; set; }
public static MyObj GetObject(int prmId){
var obj = DAL.get(prmId).FirstOrDefault();
return obj != null ? obj : new MyObj();
}
}
static class DAL {
public static List<MyObj> get(int? prmId){
// database stuff to call a Stored Procedure and return 0 or more MyObjs
}
}