title: DDD & Factories - Intensive CRUD Operations
body: <p>We have recently decided to adopt DDD in my team for our new projects because of the so many obvious benefits (coming from the Active-Record pattern school) and there are a couple of things that are yet unclear.</p>
  
  <p>Say I have an entity Transaction that depends on the following entities (that each in turn depends on other so many entities):
  1. Customer
  2. Account
  3. Currency</p>
  
  <p>When I make use of factories to instantiate a Transaction entity to pass to a Domain Service for some fancy business rules, do I make so many queries to setup all these dependent instances?</p>
  
  <p>If I have overloads in my factory that skip such dependencies then those will be null in some cases and it will become too complicated to differentiate when I can access those properties and when I cannot. With Active-Record pattern I just use lazy loading and have them load only on demand. Any ideas with DDD?</p>
  
  <p>EDIT:</p>
  
  <p>In my scenario “Transaction” seems to be the best candidate for an Aggregate root. I have defined a method in my Application Service “InitiateTransaction” (also have a “FinalizeTransaction” as it involves a redirect to PayPal) and takes as parameters the DTOs needed to carry AccountId, CurrencyId, LanguageId and various other foreign keys as well as Transaction attributes.</p>
  
  <p>When calling my Domain Services (Transaction Processor and Fraud Rule Evaluator), I need to specify the “Transaction” Aggregate with all dependencies loaded (“Transaction.Customer”, “Transaction.Currency”, etc.).</p>
  
  <p>So if I am correct the steps required are:
  1.  Call some repository(ies) to retrieve Customer, Currency etc.
  2.  Call TransactionFactory with dependencies specified above to get a Transaction object
  3.  Call Domain Services with fully loaded Transaction object for business rules to take place</p>
  
  <p>Correct? Additionally, my concern was about steps 1 and 2.</p>
  
  <p>If “Customer”, “Currency” and other Entities/Value Objects “Transaction” depends on, have in turn other dependencies. Do I try to set up those as well? Because it seems to me that if I do I will end up with very bloated code in my Application Service and not very reusable to place in a separate method. However, if I don’t and just retrieve those from a repository with a “GetById(id)”as you suggested, my code could end up buggy as say I need property “Transaction.Customer.CreatedByUser” which returns a “User” instance, it will be null because repositories only load flat instances.</p>
  
  <p>EDIT:</p>
  
  <p>I ended up using GetById(id) to load only the dependencies I knew they were needed in my Services. Not a big fun of accidentally accessing null instances due to flat loading but I have my unit tests to protect me from taking it to production!!</p>