【问题标题】:C# - Referencing objects in MVC data modelC# - 在 MVC 数据模型中引用对象
【发布时间】:2015-05-25 20:47:31
【问题描述】:

我正在使用 C# 中的 MVC 模式构建一个软件。该软件有一个具有许多类的复杂数据模型,并在运行时创建这些模型类的大量对象(由用户控制)。但是,一个类 (ParkingGarage) 的对象引用了另一类 (Car) 的对象 - 因此 ParkingGarage 对象存储对当前停放的所有 Car 对象(在一个数组中)的引用在特定的车库里。

班级Car

- Property (String) Model
- Property (String) Color
- Property (String) LicensePlate

班级ParkingGarage

- Property (String) Name
- Property (String) LocationAddress
- Property (Array) ParkedCars

当现在将Car 对象存储在ParkingGarage 对象的数组中时,我可以只拥有一个充满Car 对象的数组,还是应该只存储某种标识符(可能是Car类)?

我目前的假设是:如果我将 Car 对象添加到 ParkingGarage 对象的 Array ParkedCars 中,则该数组只包含对汽车对象的引用,对吧?我对此有什么问题吗?

【问题讨论】:

  • 保持对对象集合(汽车)的引用很好,除非您遇到特定问题?一般来说,做最简单最容易的事情是好的,但当然,如果您预见到问题,那么请考虑延迟加载、过滤集合等。
  • 通常您会将汽车存放在某种商店中,并有一个存储库来根据型号、品牌等获取您需要的汽车。
  • 我担心的是内存问题,因为可能有很多汽车对象,万一有一个会被破坏,但车库对象仍然拥有引用。我对 C# 很陌生,因此不是内存管理专家。商店/存储库是什么意思?你能告诉我更多的细节吗?

标签: c# oop model-view-controller reference


【解决方案1】:

将内存管理问题留给运行时,并使用通用列表类型List<> 而不是数组 来保存您的数据。 List<T> 代表一个可增长的对象列表,并提供了诸如AddRemove 之类的方法,它们实际上在后台操纵T 数组以产生所需的结果。

这里有一些代码可以作为指导。

public class Car
{
    public int Id { get; set;}
    public string Model { get; set; }
    public string Color { get; set; }
    public string LicensePlate { get; set; }

}

public class ParkingGarage
{
    private List<Car> parkedCars;

    public int Id { get; set; }
    public string Name { get; set; }
    public string LocationAddress { get; set; }

    public List<Car> ParkedCars
    {
        get { return parkedCars; }
    }

    public ParkingGarage()
    {
        parkedCars = new List<Car>();
    }

    public void AddCar(Car car)
    {
        // perform validation
        parkedCars.Add(car);
    }
}

要从数据库中检索汽车,您可以使用存储库模式:

public class CarRepository
{
    public List<Car> FindAll()
    {
        // Code to retrieve all cars 
        List<Car> cars = new List<Car>();
        // Retrieve All rows from Cars Table and populate the List
        return cars;           
    }

    public List<Car> FindAllWith(string carModel)
    {
        // Code to retrieve all cars with a particular model
    }

    public List<Car> FindAllWith(int parkingGarageId)
    {
        // Code to retrieve all cars from a particular parking garage
    }

    public void Save(Car car)
    {
       // Code to save car to the database
    }

}

同样,不要担心内存管理,您最好专注于为您的项目创建一个好的模型。

【讨论】:

  • 谢谢,还有一个问题:CarRepository 中不应该有 List&lt;Car&gt; 的属性或公共变量吗?
  • 我认为没有理由在存储库中拥有 List&lt;Car&gt; 属性。你为什么这么认为?
  • 然后,您如何使用FindAll() 方法找到所有汽车对象?不应该有一个包含所有Car 对象的列表吗?
  • 您首先创建存储库CarRepository repo = new CarRepository(); 的实例,然后像这样填充汽车列表:List&lt;Car&gt; allCars = repo.FindAll();
  • 嗯,好的,现在知道了。您假设我使用了一个数据库或类似的数据库,它包含所有汽车对象,并且存储库将它们加载到 List - 就像数据库的镜像
猜你喜欢
  • 2012-11-17
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2012-03-24
相关资源
最近更新 更多