I use a pattern that I call "ensure" extensively in my repository layer. In short, it does the following when I call an Ensure(...) method:

  1. It uses the arguments in the method to attempt to populate an entity of a specified type (ultimately from the database),
  2. If it finds one then it returns it; f it does not, it saves the entity to the database and return it.

So, my Ensure method ensures that there is always a populated entity with specified properties, irrespective of whether one existed before the call was made.

Is there already a more commonly known name for this pattern?

  • Doesn't this pattern break the query / command separation principle (en.wikipedia.org/wiki/Command%E2%80%93query_separation)? – Giorgio Dec 14 '13 at 9:30
  • Good question - however, under the hood it does two separate calls. So, it doesn't violate the principle. This kind of pattern is used quite a lot in well written import routines, for example. It's a shame that I cannot find a name for it. – CarneyCode Dec 14 '13 at 10:03
  • Are assertions what you look for? en.wikipedia.org/wiki/Assertion_(software_development) – JensG Dec 14 '13 at 10:43
  • 4
    We tend to call it GetOrCreate. @JensG I don't think assertions are going to help here. I think the description makes it pretty clear that he wants to return a specific instance - and if it doesn't exist already - create it first. A sort of lazy instantiation, but in this case the database plays a role in it as well. – Marjan Venema Dec 14 '13 at 10:54
  • 4
    Hey @Carnotaurus, why did you delete this? Don't worry about the downvote, it's a decent question. You can't reply to this comment while the question is deleted, if you want to further discuss the question I'll be in our chat room. In any case, look up lazy initialization, it's a technique that's very close to what you are doing. – yannis Dec 14 '13 at 12:30

I believe your name is correct, Microsoft has a method called .GetOrCreate(int id, ...) in the LifetimeContext class located at System.Composition.Hosting namespace (.NET 4.5) that does exactly this. See here

But, my opinion is that you are in fact implementing a different version of a Multiton Pattern (see here) the only difference from the normal implementation is that instead of having a cache of entities, you are going to the database to check for the "instances", so you could consider changing your method to .GetInstance(int id) or even .GetInstance<T> in a generic repository.

But your name is also correct, like i said, it´s a different approach.

  • +1 for multiton, might also consider this a form of memoization – jk. Jan 22 '14 at 16:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.