using System.Linq.Expressions;
private static IContainer Container;
public static void Main() {
var service = Container.Resolve<IUserService>();
var userName = Guid.NewGuid().ToString("N") + "@userName";
service.SaveUser(new User {
Email = userName + "@domain.com"
var user = service.GetUserByUserName(userName);
private static void SetupDIContainer() {
var builder = new ContainerBuilder();
.Register(context => OdbFactory.OpenInMemory())
.RegisterType<NDatabaseRepository>()
.RegisterType<UserService>()
.InstancePerDependency();
Container = builder.Build();
public interface IRepository {
void Store<T>(T obj) where T : Entity;
void Delete<T>(T obj) where T : Entity;
T Get<T>(Expression<Func<T, bool>> expression) where T : Entity;
IQueryable<T> List<T>() where T : Entity;
public class NDatabaseRepository : IRepository, IDisposable {
private readonly IOdb _odb;
public NDatabaseRepository(IOdb odb) {
throw new ArgumentNullException("odb");
public void Store<T>(T obj) where T : Entity {
throw new ArgumentNullException("obj");
if (obj.ID == Guid.Empty) {
public void Delete<T>(T obj) where T : Entity {
throw new ArgumentNullException("obj");
var existingObj = List<T>().SingleOrDefault(_ => _.ID.Equals(obj.ID));
if (existingObj == null) {
_odb.Delete(existingObj);
public T Get<T>(Expression<Func<T, bool>> expression) where T : Entity {
if (expression == null) {
throw new ArgumentNullException("expression");
return _odb.AsQueryable<T>().SingleOrDefault(expression);
public IQueryable<T> List<T>() where T : Entity {
return _odb.AsQueryable<T>();
GC.SuppressFinalize(this);
protected virtual void Dispose(bool disposing) {
if (_disposed) { return; }
public interface IUserService {
void SaveUser(User user);
User GetUserByUserName(string userName);
public class UserService : IUserService {
private readonly IRepository _repository;
public UserService(IRepository repository) {
if (repository == null) {
throw new ArgumentNullException("repository");
_repository = repository;
public void SaveUser(User user) {
throw new ArgumentNullException("user");
public User GetUserByUserName(string userName) {
if (string.IsNullOrWhiteSpace(userName)) {
throw new ArgumentException("Parameter cannot be null, empty or white spaces.", "userName");
return _repository.Get<User>(_ => _.UserName.Equals(userName));
public abstract class Entity {
public Guid ID { get; set; }
public class User : Entity {
public string UserName { get; set; }
public string Email { get; set; }