0

У меня есть финансовое приложение, которое обрабатывает «облигации». Мне нужноСоздание объектов - Полиморфизм

  1. Модель приложения, чтобы избежать анемичной модели (что я понимаю плохо).
  2. Мгновентиляция различных реализаций в зависимости от типа связи.

Система получает инструкции от внешней системы и применяет инструкции к указанной связи. следовательно, у меня есть юридическое лицо

Instruction[Id,BondReference,Action,Value] 

например. из инструкции к голосования 'да' для разрешения в передается на связи

Instruction 
{ 
    BondReference: Bond1, 
    Action: Vote 
    Value: VoteYes 
    ResolutionReference: Resolution1 
} 

и лица Bond

Bond 
{ 
    Id: 1, 
    Reference: Bond1 
    Resolutions: [ 
        {Resolution1: We have resolved to increase our stake in Google}, 
        {Resolution2: We have resolved to fire the CEO} 
        ... 
       ] 
    Instructions: [Inst1,Inst2,Inst3...] 
} 

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

Мне было предложено использовать службу домена для обработки новой инструкции.

BondService 
{ 
    public void Apply(Instruction newInstruction) 
    { 
     var bond = _bondRepository.GetByReference(newInstruction); 
     bond 
      .RecalculateNominalValue(newInstruction) 
      .CalculateInterest(newInstruction) 
      .CancelInstruction(newInstruction) 
      .Approve(newInstruction); 
    } 
} 

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

Теперь мой вопрос,

  1. Это лучший способ модель?
  2. И для расчета, в зависимости от типа связи, расчет отличается. Поэтому я хочу реализовать полиморфизм. Мне сказали, что мне нужно использовать фабрику для создания правильной реализации. Это лучший подход?

Для BondType 1,3,5 я использую calculationA для bondType 2,7 ... мне нужно использовать Расчет B. Как я Instantiate различных типов известково ??? NB, я хорошо разбираюсь в полиморфизме, однако я не смог найти убедительные примеры того, как создавать правильную реализацию. Thnx за чтение этого далеко ...

ответ

2

Несколько мыслей:

  • Instruction кажется, что он служит для командной DTO и значение объекта, используемый для хранения аудита. Развяжите эти два понятия.

  • Объект Bond, как это типично для финансовых доменов, требует event sourcing. По сути, вы уже там, сохраняя все инструкции и разрешения. Сделайте это явным. Вам может не потребоваться хранить все инструкции, если вы внесете какие-либо изменения в явную связь как события домена. Одна команда может привести к нескольким событиям.

  • Пример службы домена - это фактически application service или обработчик команд. Службы приложений координируют репозитории и делегаты для объектов домена. Чтобы лучше реализовать службу приложения, делегируйте столько бизнес-логики объектам домена, в этом случае Bond. Следовательно, субъект Bond решает точно, какие подпоследовательности вызывать, чтобы служба приложения вызывала только один метод для объекта.

  • Чтобы обеспечить полиморфизм, создайте объект значения, чтобы разрешить представление различных типов связей. Имейте делегирование объекта Бонда в значение этого типа полиморфных облигаций. Возможно, вам понадобится фабрика для первоначального экземпляра этого типа облигаций VO, но как только он связан с сущностью Bond, вам больше не нужно будет звонить на завод, Bond просто ссылается на тип облигации VO.

+0

thanx для ответа, единственное, что я не упомянул, это то, что это проект заброшенного поля, и мы медленно преобразуем его в новое приложение, и тем временем мы будем использовать существующий интерфейс, следовательно, мы не может изменить структуру db и т. д. Поэтому я буду учитывать предложение источника событий (но, вероятно, (скорее всего) не реализуется сейчас), потому что мне нужно делать некоторые чтения по теме и т. д. Больше всего мне понравилось то, что 1 instr = несколько событий (я бы, скорее всего, создавал несколько команд из 1 инструкции). я буду отмечать как ответ, как только я реализую ваши предложения – sawe

+0

, поэтому мне нужна фабрика, потому что около 3 bondTypes используют один расчет, а один тип bondType использует другой расчет. поэтому в долгосрочной перспективе можно было бы добавить bondTypes, которые использовали бы другой расчет, поэтому * 1 bondType! = 1 расчет *. поэтому использование метода bondType для выполнения вычислений будет означать, что я дублирую вычисления в разных местах. имеет смысл? или я могу объяснить далее – sawe