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

本文关键字:属性 类型 模型 复杂 更新 何更新 | 更新日期: 2023-09-27 18:35:37

我有两个模型,ShipSector,其中Ship有一个名为Location的属性,它是Sector类的实例,DestinationSector类的另一个实例。 考虑到封装,飞船本身应该负责更新这些属性,所以我做了一个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.
   }
}

我使用实体框架和存储库模式。所以我有一个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实例,但这感觉就像紧密耦合,如果可能的话,我想避免这种情况。

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

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

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