oguzh4n
oguzh4n

Reputation: 682

Advice data acces pattern without repository

I want to access ISession directly from application services (without using repository (http://ayende.com/blog/3955/repository-is-the-new-singleton)) but application services unit test is hard and Nhibernate data access code increase complexity of code (no repository mock and I don't want to mock repository or in memory db like sqllite for testing)

Is there any efficient way access to ISession from service layer?

Upvotes: 1

Views: 61

Answers (1)

Goblin
Goblin

Reputation: 8032

I use a sessionHelper which basically holds the ISessionFactory - and then have methods like this:

    public T WrapQueryInTransaction<T>(Func<ISession, T> query)
    {
        using (var tx = Session.BeginTransaction())
        {
            try
            {
                var result = query(Session);
                tx.Commit();
                return result;
            }
        }
    }

I then have similar methods for common functionality - ie. xxxUpdaters which basically loads the object in question, makes the updates and then closes the ISession again.

And then usage is as follows for queries:

var entities = _sessionHelper.WrapQueryInTransaction(s => s.QueryOver<SomeEntity>().List());

For complex queries I have these incapsulated in a query class which can also be thrown at the sessionHelper.

It works for me - hope you can use it.

Upvotes: 1

Related Questions