Class 构造函数并获取设计

Class Constructor and Get Design

在设计 class 和构造函数时,我有一个关于获取记录的问题。

举个例子,如果我有车class

public Car
{
    ...
}

我可以选择创建一个可以获取特定汽车实例的构造函数,例如:

public Car(int carID)
{
    //Get car from database
}

或者我可以写一个public方法来取车:

public Car GetCarByID(int carID)
{
    //Get car from database
}

是否有获取 class 实例的首选(最佳实践)方法?代码似乎更清晰地获取了一个对象的实例:

Car MyCar = new Car(5);

对比

Car MyCar = new Car();
MyCar.GetCarByID(5);

一个简单的解决方案是使用 static method,像这样:

public static Car GetById(int carId)
{
    ... Load car and return it ...
}

那么你可以这样称呼它:

Car myCar = Car.GetById(18); 

我建议将您的数据库访问与领域模型分开 类,例如 Car。

这可以通过将所有数据库访问检索操作放在它们自己的一组 类 中来完成。这些被称为存储库。有不同的方法来制作这些存储库。这取决于你的数据在数据库中的存储方式以及你是否使用entity framework。有些人更喜欢通用存储库,而另一些人则根本不喜欢这种通用方法。但最重要的是,存储库负责访问数据库以进行对象检索和存储。它不应该由域对象(即 Car 本身)完成,因为它应该只有属于 Car 的操作以及使它成为 Car 对象的操作。将 Car 存储在数据库中不是 Car 应该知道的事情。

可以在此处找到使用存储库模式的示例: http://www.codeproject.com/Articles/688929/Repository-Pattern-and-Unit-of

MSDN 上还有一篇关于存储库模式的好文章: https://msdn.microsoft.com/en-us/library/ff649690.aspx?f=255&MSPPError=-2147217396

底线是使用存储库访问数据库。它用于从数据库加载和存储数据,并提供一个额外的抽象层。如果需要,您可以为每个存储库创建一个接口,这样您也可以进行单元测试。

比在 类 中创建不属于那里的方法要好得多。

为了解决关于关注点分离的评论,我建议如下:

public class Car
{
    public string Make {get; set;}
    public string Model {get; set;}
    // additional properties here.
}

public static class CarFactory
{
    public static Car CreateCar(string modelId)
    {
        Car car = new Car();
        // Load the car via whatever mechanism you wish;
        // e.g., web service, database, etc.
        return car;
}

Car fordFairlane = CarFactory.CreateCar("57fordFairlane");

这使得创建汽车对象的代码与汽车对象本身分开,并允许您更改汽车的创建方式而无需接触汽车 class。

正如我在评论中所说的那样,我会这样做来管理汽车并允许通过 id 或您想要加载的任何其他方式加载汽车。

public class Car
{
    public int Id { get; set; }
    public Car() { }
    public Car(int id) { Id = id; }
}

public class CarCollection
{
    public List<Car> Cars { get; set; }

    public void AddCar(Car car) { Cars.Add(car); }

    public Car GetById(int id) { return Cars.Single(x => x.Id == id); }

    public CarCollection(List<Car> cars) { Cars = cars; }
    public CarCollection(Car car) { Cars = new List<Car>() { car }; }
}