Единица работы и Entity Framework — вычисляемые свойства

Предполагая, что у меня есть следующий объект POCO:

public class SomeEntity
{
    public int SomeProperty { get; set; }
}

и следующий репозиторий

public class SomeEntityRepository
{
    Context _context;
    public SomeEntityRepository(Context context)
    {
        _context = context;
    }

    public List<SomeEntity> GetCrazyEntities()
    {
        return _context.SomeEntities.Where(se => se.SomeProperty > 500).ToList();
    }
}

Затем по какой-то причине мне нужно реализовать вычисляемое свойство для SomeEntity, например:

class SomeEntity
{
    ...
    public List<SomeEntity> WellIDependOnMyOnRepositry()
    {
        ...
        return theRepository.GetCrazyEntities().Where(se => se.SomeProperty < 505).ToList();
    }
}

Как я могу справиться с тем, что объект POCO знает о репозитории/контексте, используя правильную реализацию UnitOfWork?

Я изучал IoC и внедрение зависимостей, но я слишком глуп, чтобы понять это из летучей мыши.

Какое-то просветление?


person johnildergleidisson    schedule 30.03.2012    source источник
comment
Итак... какая именно причина заставляет вас хранить ссылку на репозиторий внутри вашей сущности? Прямо сейчас метод WellIDependOnMyRepository выглядит так, как будто он принадлежит SomeEntityRepository, а не SomeEntity.   -  person surfen    schedule 31.03.2012
comment
Да, этот пример не отражает реальной проблемы, с которой я столкнулся, и я уходил с работы в спешке. Ты прав. Я отредактирую свой вопрос, указав более точный код, когда буду дома, так как уверен, что это поможет мне получить более качественные ответы.   -  person johnildergleidisson    schedule 31.03.2012


Ответы (1)


Не прочитав обновление, которое вы упомянули в своем комментарии, я мог бы сказать, что вы должны получить Crazy Entities из репозитория в каком-то объекте службы домена, выполнить любые необходимые вам вычисления и присвоить результат своей сущности.

Кроме того, в идеале, если вы хотите изучить внедрение зависимостей (с нашим без контейнера IoC), ваш репозиторий должен реализовать интерфейс.

Что-то вроде следующего:

public interface ISomeEntityRepository
{
   List<SomeEntity> GetCrazyEntities();
}

public class SomeEntityRepository : ISomeEntityRepository
{
   // ... Implementation goes here.
}

public class MyDomainService
{
   private readonly ISomeEntityRepository Repository;

   public MyDomainService(ISomeEntityRepository repository)
   {
      Repository = repository;
   }

   public SomeEntity WorkWithCrazyEntity()
   {
      var something = Repository.GetCrazyEntities();

      var result = //.... do all sort of crazy calculation.

      var someEntity = new SomeEntity();

      someEntity.CalculatedProperty = result;

      return someEntity;
   }
}

Надеюсь, это даст вам несколько идей. Возможно, после того, как вы обновите свой вопрос, я смогу лучше понять, что вам нужно.

С Уважением.

person Sergio Romero    schedule 03.04.2012