类构造函数和获取设计

时间:2015-07-09 19:22:48

标签: c# class constructor data-access

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

在一个例子中,如果我有一个汽车类

$row = $result->fetch_object();
echo '<h3>'.$row->thumb.'</h3>';

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

public Car
{
    ...
}

或者我可以写一个公共方法来获得汽车:

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

是否有获取类实例的首选(最佳实践)方法?代码似乎更清晰,以获取对象的实例:

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

VS

Car MyCar = new Car(5);

4 个答案:

答案 0 :(得分:2)

我建议将您的数据库访问权限与您的域模型类(如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

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

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

答案 1 :(得分:2)

正如我在评论中所说的那样,我会这样做来管理汽车,并允许通过id或任何你想装载的汽车装载汽车。

{{1}}

答案 2 :(得分:1)

一个简单的解决方案是使用static method,如下所示:

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

然后你可以这样称呼它:

Car myCar = Car.GetById(18); 

答案 3 :(得分:0)

为了解决关于分离问题的意见,我建议如下:

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");

这使得创建汽车对象的代码与汽车对象本身分开,并允许您在不触及汽车类的情况下更改汽车的创建方式。