2016-02-21 2 views
0

У меня есть две модели, Ship и Sector, где Ship имеет свойство с именем Location, который является экземпляром класса Sector и Destination, который является еще одним экземпляром класса Sector. Учитывая инкапсуляцию, сам корабль должен нести ответственность за обновление этих свойств, поэтому я сделал метод 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);  
} 

Я мог бы сделать экземпляр SectorRepository в модели кораблей, но чувствует, как Tight Coupling, который я хотел бы избежать, если это возможно.

ответ

0

Если Ship.Move() необходимо загрузить секторы для того, чтобы записать это новое положение, то это было бы прекрасно, чтобы передать реализацию интерфейса ISectorRepository (или «ISectorFinderService») в качестве параметра метода Move(). Ключ состоит в том, чтобы реализовать A), что интерфейс является частью вашей модели домена, поэтому это не нарушает никаких слоев, а B) по вашей реализации, Ship уже тесно связан с концепцией секторов, поэтому передача ISectorFinderService (с подходящий уровень абстракции) на самом деле не добавляет новых концептуальных зависимостей.

Однако я понятия не имею, что представляют собой ваши сектора, или как работает алгоритм перемещения. Возможно, у вас должен быть метод Sector.GetNextSector(direction)?

+0

Мне нужно было внести небольшие изменения в мою архитектуру, но в конечном итоге выбрал метод 'ISectorRepository' для метода' Move() 'как лучший подход. Я рассмотрел ваше второе предложение, но обнаружил его более сложным в моей ситуации. Секторы организованы в сетке, но идентификаторы SectorID являются полуслучайными. Сектор создается, когда это необходимо, поэтому сектор 12 не обязательно находится рядом с Сектором 11 и т. Д. Спасибо за ваши предложения! – Bazzz

Смежные вопросы