jeudi 11 janvier 2018

Repository pattern, different identifiers

TLDR; I have one repo interface and multiple data sources, each with a different data identifier - how can I maintain having only one method in my interface?

I have a need to read a domain object OrderData from two different repositories: one is an outside service and the other one is a local database. Let's call them OutsideServiceOrderRepo and LocalDbOrderRepo. They both implement an interface called IOrderRepoRead:

Interface IOrderRepoRead
  +GetOrder(OrderEntityData) : Order

I'll never use both implementations in the same use case, it's an either/or situation. I have sorted out how to inject one or the other repo at the composition root, depending on the use case. The problem I have is that each of these data stores has a different identifier for the data I'm after:

  • Local store has a simple OrderId that I have within my system.
  • External service requires me to query using a person's Tax_number+Name+what_not etc...

The ideas I came up with so far are as follows:

  1. I have a type called OrderEntityData with properties TaxNumber, Name, OrderId. Both implementations can use this type, each implementation works with the properties it requires: OutsideServiceOrderRepo uses TaxNumber, Name, whereas LocalDbOrderRepo uses OrderId.
  2. I drop the OrderEntityData and have two different methods in my IOrderRepoRead.

.

Interface IOrderRepoRead
  +GetOrder(taxNumber, name, whatNot) : Order
  +GetOrder(orderId) : Order

I'm inclined to go with approach #1, but it still feels like there is a certain amount of coupling among the repo and client code.

How can I efficiently alternate between different identifiers?

Aucun commentaire:

Enregistrer un commentaire