main
 1using momoney.database.transactions;
 2using momoney.service.infrastructure.transactions;
 3
 4namespace MoMoney.Service.Infrastructure.Transactions
 5{
 6    public class UnitOfWorkFactory : IUnitOfWorkFactory
 7    {
 8        readonly IContext context;
 9        readonly ISessionFactory factory;
10        readonly IKey<ISession> key;
11
12        public UnitOfWorkFactory(IContext context, ISessionFactory factory, IKey<ISession> key)
13        {
14            this.context = context;
15            this.key = key;
16            this.factory = factory;
17        }
18
19        public IUnitOfWork create()
20        {
21            return unit_of_work_been_started() ? new EmptyUnitOfWork() : start_a_new_unit_of_work();
22        }
23
24        bool unit_of_work_been_started()
25        {
26            return context.contains(key);
27        }
28
29        IUnitOfWork start_a_new_unit_of_work()
30        {
31            var session = factory.create();
32            context.add(key, session);
33            return new UnitOfWork(session, context, key);
34        }
35    }
36}