Как я могу ввести поведение в конструкторы объектов Entity Framework?

2

Если у меня есть объект EntityA, который является объектом Entity Framework, как бы я начал вводить различное поведение во время создания?

Эти конкретные объекты должны использовать другую стратегию для некоторых вычислений. Я хотел бы использовать DI для предоставления правильной стратегии при создании объекта. Есть ли способ перехватить?

Добавлено: я думаю о двух шаблонах ниже (просто псевдо, чтобы получить точку).

        public partial class Entity
    {
          public Entity(ICalculationStrategy strategy)
          {
              _calcStrategy = strategy;
          }
    }

public partial class Entity
        {
              public Entity(ICalculationFactory factory)
              {
                  _calcStrategy = factory.ProvideCalculator(this);
              }
        }
  • 0
    Эти две модели существенно не отличаются. Это все еще не показывает, какие факторы определяют стратегию, которая будет использоваться этим конкретным случаем.
  • 0
    Это сложная часть. Теперь это делается так: они используют атрибут Entity (имя), соответствующий имени класса, для динамического создания правильного экземпляра калькулятора (Activator). Я не уверен, что я думаю об этом неправильно в данный момент.
Теги:
entity-framework
dependency-injection

2 ответа

2

Можете ли вы передать стратегию во время выполнения расчета?

myEntity.Calculate(myStrategy);

Как насчет инверсии отношения между стратегией и сущностью?

myStrategy.Calculate(myEntity);

Или, DI стратегия с использованием вложения свойств?

  • 1
    Я полностью учел полностью перевернуть отношения. Я начинаю склоняться в этом направлении, чем больше я об этом думаю. В моем случае в общем процессе задействовано более одного шага / стратегии. DDD Service объект может быть путь сюда. Он может управлять генерацией каждой стратегии и общим рабочим процессом, который одинаков для всех сущностей. Единственное, что меня беспокоит, так это то, что сами сущности привязаны к определенной стратегии. Я не уверен, будет ли какое-либо повторное использование. У каждой стратегии есть определенный набор данных / необходимые параметры. Есть идеи? :)
  • 0
    Под параматорами я подразумеваю действительно константы Все стратегии не используют одни и те же константы, но они частично совпадают.
1

EntityObjects не имеют конструктора, определенного в их сгенерированном коде, поэтому вы можете просто добавить его в частичный класс:

public partial class MyEntity
{
    public MyEntity()
    {
         // Whatever logic to determine your strategy
    }
}

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

Также вы просмотрели inheritance в Entity Framework? Основываясь на значении некоторого столбца/свойства, вы можете использовать его в другом подклассе, который может иметь различные реализации различной бизнес-логики, используя частичные классы с методами и свойствами abstract и/или virtual.

Конечно, вы можете изменить поведение после создания объекта, но я чувствую, что это не то, что вы хотите? Можете ли вы получить доступ к factory статическим способом? Или как статический класс, метод или свойство?

MyFactory.Current = new MyFactory(parameters);

public partial class MyEntity
{
    public MyEntity()
    {
        _calcStrategy = MyFactory.Current.ProvideCalculator(this);
    }
}
  • 0
    Мне нужно что-то большее, чем конструктор без параметров по умолчанию. По сути, я хочу внедрить стратегию во время строительства или на заводе, чтобы организация могла запросить правильную стратегию. Может быть, я расширю сферу и объясню, что я пытаюсь сделать. Направление стратегии не кажется правильным.
  • 0
    Просто хотел добавить, что в этом случае наследование не работает, поскольку у каждой сущности будет немного отличающаяся логика стратегии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню