我有两个模型Ship
和Sector
,其中Ship
有一个名为Location
的属性,它是Sector
类的一个实例,{ {1}}这是Destination
类的另一个实例。考虑到封装,船舶本身应该负责更新这些属性,所以我做了一个Sector
方法来计算船舶的进展程度,并相应地更新Move()
属性。如果新位置与目的地不同(中间有扇区且船只在中途),我如何获得对Location
实例的引用?
Sector
我使用Entity Framework和存储库模式。所以我有一个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
我可以在Ship模型中创建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);
}
的实例,但感觉就像Tight Coupling,如果可能的话,我想避免这样做。
答案 0 :(得分:0)
如果Ship.Move()
需要加载扇区以记录它的新位置,那么传递ISectorRepository
接口的实现(或&#34; ISectorFinderService
&#34;)作为Move()
方法的参数。关键是要实现A)接口是你的域模型的一部分,所以这并不违反任何层,B)通过你的实现,Ship
已经与扇区的概念紧密耦合,所以传递ISectorFinderService
(具有适当的抽象级别)并没有真正添加任何新的概念依赖。
但是,我不知道您的扇区真正代表什么,或移动算法如何工作。也许你应该有一个方法Sector.GetNextSector(direction)
?