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:
- I have a type called
OrderEntityData
with propertiesTaxNumber
,Name
,OrderId
. Both implementations can use this type, each implementation works with the properties it requires:OutsideServiceOrderRepo
usesTaxNumber
,Name
, whereasLocalDbOrderRepo
usesOrderId
. - I drop the
OrderEntityData
and have two different methods in myIOrderRepoRead
.
.
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?
orderId
while the external data store identifies orders bytaxNumber, name, whatNot
. Why do we have the same order in two different data stores? Think of it as the order's lifecycle: they start their life in our local data store, get approved and then we move them to the external data store.GetOrder(taxNumber, name, whatNot)
a finder? If so, I would opt for #2 can call that methodFindOrder(taxNumber, name, whatNot)
. The concepts are different. One is you have a unique identifier to get that specific record. The other is to find a record (or records) that match your criteria.