If you haven’t read my introductory post on SharpRepository you should give it a quick read as it provides a nice overview of the basic usage of SharpRepository. In that post, I use the simplest method for creating my repository, I just new it up like so:
var orderRepository = new InMemoryRepository<Order>();
While this definitely works, it isn’t the best way. Why? Well, if you want to switch to an Ef5Repository or want to add caching, you will need to change the code and recompile. Plus, you are using dependency injection and inversion of control right? Well this doesn’t work with those patterns of course. In this post I will cover some of the various ways to create your repository.
Before getting into the code for loading up a repository via configuration settings it will be helpful to understand the SharpRepository hierarchy. Each repository has a specific type of backend that it queries (e.g. InMemory, Entity Framework, RavenDb, MongoDb, Db4o, Xml, etc.), a caching strategy (e.g. None, Standard, Timeout), and a caching provider (e.g. Memory, memcached, Azure, etc.).
The caching strategy tells the repository the rules for caching. The Timeout Strategy uses a simple time based rule, for example, cache the query results for 30 seconds, while the Standard Strategy uses Generational and Write-Through caching techniques to provide a more sophisticated caching logic. And the No Caching Strategy does not do any caching at all (it’s not just a clever name).
The caching provider on the other hand is the specific cache technology that is used. For simple websites the InMemory caching provider works great and uses the ASP.NET built-in System.Runtime.Caching.MemoryCache. For more advanced needs like distributed caching you would use the memcached provider or the Windows Azure provider and store the cache across multiple servers.
The beauty of this is that both of these can be extended by inheriting from ICachingStrategy or ICachingProvider if the need arises.
What is SharpRepository?
I think this quote sums it up nicely, “SharpRepository is amazing! I couldn’t have written the Gettysburg Address without it. Plus it picked out this awesome hat.” – Abraham Lincoln
In reality, SharpRepository is a generic repository layer with many persistence implementations like EntityFramework, RavenDB, MongoDB, and InMemory to name a few. SharpRepository abstracts away the technical concerns of your data layer by offering a common interface for dealing with your domain objects. In non-technical jargon, it allows you to add, update, delete and find data that is stored somewhere else, where, it doesn’t really matter. That is the beauty of it.
In this post, I will describe how to get up and running with SharpRepository and basic usage. In future posts we will get into more advanced usage scenarios like caching, batching, testing/mocking, as well as get into the specifics of the different type of specific repository implementations.
We all know that a great way to speed up any website is to throw some caching at it, right? When considering caching strategies there are a lot of questions you should be asking. What type of caching is right for my specific situation? Do we have to worry about serving up stale data, and if so how do we go about handling that? Plus another dozen or so questions. My goal in this post is to show a generic caching strategy that can be implemented in most web applications and just work.
“So what exactly are you looking for when it comes to a generic non-website specific caching strategy?” you
might probably didn’t ask. Good question.
- Generic implementation
By that I mean I can just throw it at any new project I’m working on and don’t have to customize it for the type of data I’m dealing with, or any specific cache implementation (i.e. Memcached, in-memory cache, etc.)
- Stays out of my way
I don’t want to have to specifically clear out the cache for my entity whenever it is updated, or manage cache keys to invalidate previous queries.
- Don’t serve up stale data
There are certain situations where stale data is acceptable, but for a generic implementation we want to be conservative and only serve up to date data.
There are 2 types of main data you will be dealing with in your application: single entities (think CRUD) and queries (give me all the posts in a category). I’ll be dealing with these types differently. For single entities, I’ll implement write-through caching and for queries I’ll be using generational caching.
- iOS Unit Testing With OCMock
- Why Stakeholders Need To Be Involved In Scrum
- NuGet Config File Transformation Causes Duplicate Entries On Update
- Load Testing with Locust on Windows
- Writing A Custom LINQ Provider With Re-linq
- AutoMapper Profile Organization
- Rails 3.2: A Nested-Form Demo Part 4: Switch to Targeting Computer!
- SharpRepository: Configuration
- Rails 3.2: A Nested-Form Demo, Part 3: We’re Starting Our Attack Run!
- Rails 3.2: A Nested-Form Demo, Part 2: Accelerate to Attack Speed!
- Rails 3.2: A Nested-Form Demo, Part 1: All Wings Report In!
- iOS Behind the Curve
- Distributed Transaction Coordinators, Port 135, and Firewalls – Oh My!
- SharpRepository: Getting Started
- Find Performance Problems Using JMeter, MySQL and Xdebug/Webgrind
- Taming Hot Key Context Shifting When Running A Windows VM In Virtualbox On OSX
- Integrating Twitter’s Bootstrap Into Your Project
- Mobile payments, tags and more using NFC
- Stress Pig
- Dear Client Services, What Works?
- What Would Steve Do?
- Still Using Fiddler to Test & Debug Your REST Services?
- Write-through and Generational Caching Make a Great Team
- Thinking Recursively
- Development Incentives, What’s the Payoff?
- How do you like them Apples?
- “Optional” Software Development Practices Series — Code Review
- Adding Images to Select Lists in MVC3
- “Optional” Software Development Practices Series
- You Get What You Pay For…
- Outsourcing Safety Tips
- Facebook IPO
- The Ballad of Tim Toady
- The Little Schemer
- Newsflash: Mom leaves tech job at 5p.m.
- I <negative_emotion> Windows 8!
- Prefix vs. Postfix Increment and Decrement Operators in C++
- Corporate videos: viral boon or epic fail?
- Recruitin’ Time!
- Reference vs. pointer parameters in C++
- The IE8 "hover" Bug: The Most Awesome IE Bug Ever?
- When is perfect perfect enough?
- SOPA/PIPA: Anti-Censorship Protest or Techies Revenge?
- A Decade of Fairway
- Handling Session Timeout Gracefully
- Generating Software Diagrams
- The Audacity of Nope
- The Origins of Culture
- Scrum Overview in Prezi – not another boring slideshow
- Numbers don’t lie: LinkedIn Statistics
- What is your favorite software development tool?
- Best Practices for Selecting Onshore, Nearshore or Offshore Information Technology Outsourcing (ITO) Providers
- Sign of the Times
- Advantages and Risks of Offshoring, Nearshoring or Onshoring
- Does Outsourcing Mean Offshoring?
- Too little, too late?
- New Favorite Lunch Spot
- Why should I care about functions as first-class citizens?
- PHP Remote Debugging with XDebug and NetBeans
- Installing SubText with Web PI
- ROI Primer
- Learn Domain-Driven Design
- Learn Behavior-Driven Development
- Mario Kart Tournament
- F# in 90 Seconds
- Website Vulnerabilities
- Scrum Overview
- Language Club
- Top 12 Favorite Podcasts Ever…
- Fairway Dart Tournament
- Learn Lean Software Development and Kanban Systems
- Android – Eclipse Quick Start
- Learn Functional Programming
- Backup & Restore Strategy
- Smartphone Screens – Another Wireless Variable
- Wireless Application Market
- Head First AOP