This Data accessor manages separate sub-data accessors per thread. This is needed because in some cases the ADO.NET provider is not thread-safe (eg SQL CE) so maintaining a separate database connection per thread is required. To use it make sure that each thread in your system has added its own dataaccessor using AddDataAccessorForThread
Inheritance: IDataAccessor
 public void Test_ClearDeadThreads()
 {
     //---------------Set up test pack-------------------
     const int BarrierTimeout = 10000;
     var dataAccessorMain = new DataAccessorInMemory();
     var dataAccessor = new DataAccessorThreadSplitter(dataAccessorMain);
     var expectedDataAccessorForThread = new DataAccessorInMemory();
     using (var entryBarrier = new Barrier(2))
     using (var exitBarrier = new Barrier(2))
     {
         var thread = new Thread(() =>
         {
             dataAccessor.AddDataAccessorForThread(expectedDataAccessorForThread);
             entryBarrier.SignalAndWait(BarrierTimeout);
             exitBarrier.SignalAndWait(BarrierTimeout);
         });
         thread.Start();
         entryBarrier.SignalAndWait(BarrierTimeout);
         //---------------Assert preconditions---------------
         Assert.AreSame(expectedDataAccessorForThread, dataAccessor.GetDataAccessorForThread(thread));
         //---------------Execute Test ----------------------
         exitBarrier.SignalAndWait(BarrierTimeout);
         thread.Join();
         dataAccessor.ClearDeadThreads();
         //---------------Test Result -----------------------
         var exception = Assert.Throws<HabaneroDeveloperException>(() => dataAccessor.GetDataAccessorForThread(thread));
         StringAssert.Contains("Data accessor for thread does not exist", exception.Message);
     }
 }
 public void Test_WithThread()
 {
     //---------------Set up test pack-------------------
     const int BarrierTimeout = 10000;
     var dataAccessorMain = new DataAccessorInMemory();
     var dataAccessor = new DataAccessorThreadSplitter(dataAccessorMain);
     var expectedDataAccessorForThread = new DataAccessorInMemory();
     using (var entryBarrier = new Barrier(2))
     using (var exitBarrier = new Barrier(2))
     {
         var thread = new Thread(() =>
         {
             dataAccessor.AddDataAccessorForThread(expectedDataAccessorForThread);
             entryBarrier.SignalAndWait(BarrierTimeout);
             exitBarrier.SignalAndWait(BarrierTimeout);
         });
         thread.Start();
         entryBarrier.SignalAndWait(BarrierTimeout);
         //---------------Execute Test ----------------------
         var dataAccessorForThread = dataAccessor.GetDataAccessorForThread(thread);
         exitBarrier.SignalAndWait(BarrierTimeout);
         //---------------Test Result -----------------------
         Assert.AreSame(expectedDataAccessorForThread, dataAccessorForThread);
     }
 }
        public void Test_Construct_WithDefaults()
        {
            //---------------Set up test pack-------------------

            //---------------Execute Test ----------------------
            IDataAccessor dataAccessor = new DataAccessorThreadSplitter(new DataAccessorInMemory());
            //---------------Test Result -----------------------
            Assert.IsInstanceOf(typeof(IBusinessObjectLoader), dataAccessor.BusinessObjectLoader);
            Assert.IsInstanceOf(typeof(ITransactionCommitter), dataAccessor.CreateTransactionCommitter());
            //---------------Tear down -------------------------
        }
 public void Test_WithThread()
 {
     //---------------Set up test pack-------------------
     var dataAccessorMain = new DataAccessorInMemory();
     var dataAccessor = new DataAccessorThreadSplitter(dataAccessorMain);
     var expectedDataAccessorForThread = new DataAccessorInMemory();
     var thread = new Thread(() =>
                                 {
                                     dataAccessor.AddDataAccessorForThread(expectedDataAccessorForThread);
                                     Thread.Sleep(1000);
                                 });
     thread.Start();
     Thread.Sleep(500);
     //---------------Execute Test ----------------------
     var dataAccessorForThread = dataAccessor.GetDataAccessorForThread(thread);
     //---------------Test Result -----------------------
     Assert.AreSame(expectedDataAccessorForThread, dataAccessorForThread);
 }
 public void Test_ClearDeadThreads()
 {
     //---------------Set up test pack-------------------
     var dataAccessorMain = new DataAccessorInMemory();
     var dataAccessor = new DataAccessorThreadSplitter(dataAccessorMain);
     var expectedDataAccessorForThread = new DataAccessorInMemory();
     var thread = new Thread(() => dataAccessor.AddDataAccessorForThread(expectedDataAccessorForThread));
     thread.Start();
     thread.Join();
     //---------------Assert preconditions---------------
     Assert.AreSame(expectedDataAccessorForThread, dataAccessor.GetDataAccessorForThread(thread));
     //---------------Execute Test ----------------------
     dataAccessor.ClearDeadThreads();
     //---------------Test Result -----------------------
     try
     {
         Assert.IsNull(dataAccessor.GetDataAccessorForThread(thread));
         Assert.Fail("An exception should be thrown");
     } catch (HabaneroDeveloperException ex)
     {
         StringAssert.Contains("Data accessor for thread does not exist", ex.Message);
     }
 }