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 }; }
}
在设计 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 }; }
}