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
They both implement an interface called
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
OrderIdthat I have within my system.
- External service requires me to query using a person's
The ideas I came up with so far are as follows:
- I have a type called
OrderId. Both implementations can use this type, each implementation works with the properties it requires:
- I drop the
OrderEntityDataand have two different methods in my
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?