设置“this"等于构造函数中的现有对象

本文关键字:构造函数 对象 this quot 设置 | 更新日期: 2023-09-27 18:14:44

一个奇怪的问题,但我希望有一些东西可以帮助缩短这个过程,否则我将不得不为每个项目做很多很多次。

我们已经在办公室向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]"?

我在许多实体中使用相同的结构,因此任何快捷方式都将非常感谢。

设置“this"等于构造函数中的现有对象

你犯了一些架构上的错误:

第一个是领域模型实体必须不知道它必须如何保存/加载。所以你违反了单一责任原则。您必须在它们之上有一个存储库或其他模式来处理持久化逻辑。

第二个错误是,一般来说,您已经在域模型实体中引入了具体的依赖关系(DAL类被视为域模型实体中的具体类型)。这是一个坏习惯,你违反了控制反转原则和一般所说的"代码高于抽象而不是具体实现"的规则。

你可以有一个静态的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
     }
}