如何更新复杂类型(模型)属性?

How to update a complex type (model) property?

我有两个模型,ShipSector,其中 Ship 有一个名为 Location 的 属性,它是 [=14] 的一个实例=] class 和 Destination 这是 Sector class 的另一个实例。考虑到封装,船本身应该负责更新这些属性,所以我做了一个 Move() 方法来计算船的进度,并相应地更新 Location 属性。如果新位置与目的地不同(中间有扇区并且船在中途),我如何获得对该实例的引用Sector?

public class Ship
{
   public Sector Location { get; set; }
   public Sector Destination { get; set; }

   public void Move() 
   {
   // some magic happens here. Now I would like to update the Location.
   }
}

我使用 Entity Framework 和存储库模式。所以我有一个 SectorRepository 和一个 ShipRepository 都实现了以下接口。

public interface IRepository<T>
{
   T Get(int id);
   T Get(Expression<Func<T, bool>> predicate);
   void Add(T entity);
   void Remove(T entity);
   List<T> GetAll();
   List<T> Search(Expression<Func<T, bool>> predicate);      
}

我可以在 Ship 模型中创建 SectorRepository 的实例,但感觉就像 Tight Coupling,我希望尽可能避免这种情况。

如果 Ship.Move() 需要加载扇区以记录它的新位置,那么传递 ISectorRepository 接口(或“ISectorFinderService ") 作为 Move() 方法的参数。关键是要意识到 A) 接口是您的域模型的一部分,因此这不会违反任何层,并且 B) 通过您的实现,Ship 已经与扇区的概念紧密耦合,因此传递一个ISectorFinderService(具有适当的抽象级别)并没有真正添加任何新的概念依赖性。

但是,我不知道您的扇区真正代表什么,也不知道移动算法是如何工作的。也许你应该有一个方法 Sector.GetNextSector(direction)?