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

时间:2016-02-21 11:17:34

标签: c# entity-framework encapsulation

我有两个模型ShipSector,其中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,如果可能的话,我想避免这样做。

1 个答案:

答案 0 :(得分:0)

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

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