Author: gbayon
Date: Mon Mar 13 10:32:04 2006
New Revision: 385615

URL: http://svn.apache.org/viewcvs?rev=385615&view=rev
Log:
- Added class Timer to do Unit test
- Updated 2005 solution

Added:
    
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs
   (with props)
Modified:
    
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj
    
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs
    
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj
    
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj?rev=385615&r1=385614&r2=385615&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj 
Mon Mar 13 10:32:04 2006
@@ -103,6 +103,7 @@
     <Compile Include="Domain\Account.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Domain\Simple.cs" />
     <Compile Include="NUnit\CommonTests\ConfigWatcher\ConfigWatcherTest.cs">
       <SubType>Code</SubType>
     </Compile>
@@ -130,10 +131,12 @@
     <Compile Include="NUnit\CommonTests\Transaction\TransactionTest.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="NUnit\CommonTests\Utilities\ObjectFactoryTest.cs" />
     <Compile Include="NUnit\CommonTests\Utilities\PropertyAccessorTest.cs" />
     <Compile Include="NUnit\CommonTests\Utilities\ResourcesTest.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="NUnit\CommonTests\Utilities\Timer.cs" />
     <Compile Include="NUnit\CommonTests\Utilities\TypeResolverTest.cs" />
     <None Include="bin\Debug\dao_Access_OleDb.config" />
     <None Include="bin\Debug\dao_MSSQL_Odbc.config" />

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj?rev=385615&r1=385614&r2=385615&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj 
(original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj 
Mon Mar 13 10:32:04 2006
@@ -305,6 +305,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "NUnit\CommonTests\Utilities\Timer.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "Scripts\Access\account-init.sql"
                     BuildAction = "Content"
                 />

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs?rev=385615&r1=385614&r2=385615&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs
 Mon Mar 13 10:32:04 2006
@@ -1,6 +1,3 @@
-using System.ComponentModel;
-using System.Runtime.InteropServices;
-using System.Threading;
 using IBatisNet.Common.Test.Domain;
 using IBatisNet.Common.Utilities.Objects;
 using NUnit.Framework;
@@ -47,7 +44,7 @@
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
 
-                       HiPerformanceTimer timer = new HiPerformanceTimer();
+                       Timer timer = new Timer();
                        timer.Start();
                        for (int i = 0; i < TEST_ITERATIONS; i++)
                        {
@@ -112,43 +109,5 @@
                        }
                }
 
-               internal class HiPerformanceTimer
-               {
-                       [DllImport("Kernel32.dll")]
-                       private static extern bool QueryPerformanceCounter(out 
long lpPerformanceCount);
-
-                       [DllImport("Kernel32.dll")]
-                       private static extern bool 
QueryPerformanceFrequency(out long lpFrequency);
-
-                       private long startTime, stopTime;
-                       private long freq;
-
-                       public HiPerformanceTimer()
-                       {
-                               startTime = 0;
-                               stopTime = 0;
-
-                               if (QueryPerformanceFrequency(out freq) == 
false)
-                               {
-                                       throw new Win32Exception();
-                               }
-                       }
-
-                       public void Start()
-                       {
-                               Thread.Sleep(0);
-                               QueryPerformanceCounter(out startTime);
-                       }
-
-                       public void Stop()
-                       {
-                               QueryPerformanceCounter(out stopTime);
-                       }
-
-                       public double Duration
-                       {
-                               get { return (double) (stopTime - 
startTime)/(double) freq; }
-                       }
-               }
        }
 }

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs?rev=385615&r1=385614&r2=385615&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs
 Mon Mar 13 10:32:04 2006
@@ -39,34 +39,46 @@
             const int TEST_ITERATIONS = 1000000;
                Account account = new Account();
             int test = -1;
+                       Timer timer = new Timer();
 
                        #region Direct access (fastest)
-                       long time = DateTime.Now.Ticks;
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
+                       timer.Start();
                        for (int i = 0; i < TEST_ITERATIONS; i++)
                        {
                                test = -1;
                                test = account.Id;
                                Assert.AreEqual(0, test);
                        }
-                       long directAccessMs = DateTime.Now.Ticks - time;
+                       timer.Stop();
+                       double directAccessDuration = 1000000 * (timer.Duration 
/ (double)TEST_ITERATIONS);
                        #endregion
 
                        #region IL Property accessor
-               IPropertyAccessor propertyAccessor = 
ILPropertyAccessor.CreatePropertyAccessor(typeof(Account), "Id");
-                       time = DateTime.Now.Ticks;
-            for (int i = 0; i < TEST_ITERATIONS; i++)
-            {
-                test = -1;
-                test = (int)propertyAccessor.Get(account);
-                Assert.AreEqual(0, test);
-            }
-            long propertyAccessorMs = DateTime.Now.Ticks - time;
-                       float propertyAccessorRatio = (float)propertyAccessorMs 
/ directAccessMs;
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
+                       IPropertyAccessor propertyAccessor = 
ILPropertyAccessor.CreatePropertyAccessor(typeof(Account), "Id");
+                       timer.Start();
+                       for (int i = 0; i < TEST_ITERATIONS; i++)
+                       {
+                               test = -1;
+                               test = (int)propertyAccessor.Get(account);
+                               Assert.AreEqual(0, test);
+                       }
+                       timer.Stop();
+                       double propertyAccessorDuration = 1000000 * 
(timer.Duration / (double)TEST_ITERATIONS);
+                       double propertyAccessorRatio = propertyAccessorDuration 
/ directAccessDuration;
                        #endregion
 
                        #region IBatisNet.Common.Utilities.Object.ReflectionInfo
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
                        ReflectionInfo reflectionInfo = 
ReflectionInfo.GetInstance(account.GetType());
-                       time = DateTime.Now.Ticks;
+                       timer.Start();
                        for (int i = 0; i < TEST_ITERATIONS; i++)
                        {
                                test = -1;
@@ -74,13 +86,17 @@
                                test = (int)propertyInfo.GetValue(account, 
null);
                                Assert.AreEqual(0, test);
                        }
-                       long reflectionInfoMs = DateTime.Now.Ticks - time;
-                       float reflectionInfoRatio = (float)reflectionInfoMs / 
directAccessMs;
+                       timer.Stop();
+                       double reflectionInfoDuration = 1000000 * 
(timer.Duration / (double)TEST_ITERATIONS);
+                       double reflectionInfoRatio = 
(float)reflectionInfoDuration / directAccessDuration;
                        #endregion
 
                        #region Reflection
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
                        Type type = account.GetType();
-                       time = DateTime.Now.Ticks;
+                       timer.Start();
                        for (int i = 0; i < TEST_ITERATIONS; i++)
                        {
                                test = -1;
@@ -88,13 +104,16 @@
                                test = (int)propertyInfo.GetValue(account, 
null);
                                Assert.AreEqual(0, test);
                        }
-                       long reflectionMs = DateTime.Now.Ticks - time;
-                       float reflectionRatio = (float)reflectionMs / 
directAccessMs;
+                       timer.Stop();
+                       double reflectionDuration = 1000000 * (timer.Duration / 
(double)TEST_ITERATIONS);
+                       double reflectionRatio = reflectionDuration / 
directAccessDuration;
                        #endregion
 
                        #region ReflectionInvokeMember (slowest)
-                       type = account.GetType();
-                       time = DateTime.Now.Ticks;
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
+                       timer.Start();
                        for (int i = 0; i < TEST_ITERATIONS; i++)
                        {
                                test = -1;
@@ -103,17 +122,18 @@
                                        null, account, null);
                                Assert.AreEqual(0, test);
                        }
-                       long reflectionInvokeMemberMs = DateTime.Now.Ticks - 
time;
-                       float reflectionInvokeMemberRatio = 
(float)reflectionInvokeMemberMs / directAccessMs;
+                       timer.Stop();
+                       double reflectionInvokeMemberDuration = 1000000 * 
(timer.Duration / (double)TEST_ITERATIONS);
+                       double reflectionInvokeMemberRatio = 
reflectionInvokeMemberDuration / directAccessDuration;
                        #endregion
 
                        // Print results
                        Console.WriteLine("{0} property gets on integer...", 
TEST_ITERATIONS);
-                       Console.WriteLine("Direct access: \t\t{0} ms", 
directAccessMs);
-                       Console.WriteLine("IPropertyAccessor: \t\t{0} ms Ratio: 
{1}", propertyAccessorMs, propertyAccessorRatio);
-                       Console.WriteLine("IBatisNet ReflectionInfo: \t{0} ms 
Ratio: {1}", reflectionInfoMs, reflectionInfoRatio);
-                       Console.WriteLine("ReflectionInvokeMember: \t{0} ms 
Ratio: {1}", reflectionInvokeMemberMs, reflectionInvokeMemberRatio);
-                       Console.WriteLine("Reflection: \t\t\t{0} ms Ratio: 
{1}", reflectionMs, reflectionRatio);
+                       Console.WriteLine("Direct access: \t\t{0} ", 
directAccessDuration.ToString("F3"));
+                       Console.WriteLine("IPropertyAccessor: \t\t{0} Ratio: 
{1}", propertyAccessorDuration.ToString("F3"), 
propertyAccessorRatio.ToString("F3"));
+                       Console.WriteLine("IBatisNet ReflectionInfo: \t{0} 
Ratio: {1}", reflectionInfoDuration.ToString("F3"), 
reflectionInfoRatio.ToString("F3"));
+                       Console.WriteLine("ReflectionInvokeMember: \t{0} Ratio: 
{1}", reflectionInvokeMemberDuration.ToString("F3"), 
reflectionInvokeMemberRatio.ToString("F3"));
+                       Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", 
reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3"));
         }
         
                /// <summary>
@@ -125,72 +145,91 @@
             const int TEST_ITERATIONS = 1000000;
             Account account = new Account();
             int value = 123;
+            Timer timer = new Timer();
 
                        #region Direct access (fastest)
-                       long start = DateTime.Now.Ticks;
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
+            timer.Start();
                        for (int i = 0; i < TEST_ITERATIONS; i++)
                        {
                                account.Id = value;
                        }
-                       long directAccessMs = DateTime.Now.Ticks - start;
+            timer.Stop();
+            double directAccessDuration = 1000000 * (timer.Duration / 
(double)TEST_ITERATIONS);
                        #endregion
 
                        #region Property accessor
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
             IPropertyAccessor propertyAccessor = 
ILPropertyAccessor.CreatePropertyAccessor(typeof(Account), "Id");
-            start = DateTime.Now.Ticks;
+            timer.Start();
             for (int i = 0; i < TEST_ITERATIONS; i++)
             {
                 propertyAccessor.Set(account, value);
             }
-            long propertyAccessorMs = DateTime.Now.Ticks - start;
-                       float propertyAccessorRatio = (float)propertyAccessorMs 
/ directAccessMs;
+            timer.Stop();
+            double propertyAccessorDuration = 1000000 * (timer.Duration / 
(double)TEST_ITERATIONS);
+            double propertyAccessorRatio = propertyAccessorDuration / 
directAccessDuration;
                        #endregion
 
                        #region IBatisNet.Common.Utilities.Object.ReflectionInfo
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
                        Type type = account.GetType();
                        ReflectionInfo reflectionInfo = 
ReflectionInfo.GetInstance(type);
-                       start = DateTime.Now.Ticks;
+            timer.Start();
                        for (int i = 0; i < TEST_ITERATIONS; i++)
                        {
                                PropertyInfo propertyInfo = 
reflectionInfo.GetSetter("Id");
                                propertyInfo.SetValue(account, value, null);
                        }
-                       long reflectionInfoMs = DateTime.Now.Ticks - start;
-                       float reflectionInfoRatio = (float)reflectionInfoMs / 
directAccessMs;
+            timer.Stop();
+            double reflectionInfoDuration = 1000000 * (timer.Duration / 
(double)TEST_ITERATIONS);
+            double reflectionInfoRatio = reflectionInfoDuration / 
directAccessDuration;
                        #endregion
 
                        #region Reflection
-                       type = account.GetType();
-                       start = DateTime.Now.Ticks;
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
+            timer.Start();
                        for (int i = 0; i < TEST_ITERATIONS; i++)
                        {
                                PropertyInfo propertyInfo = 
type.GetProperty("Id", BindingFlags.Public | BindingFlags.SetProperty | 
BindingFlags.Instance);
                                propertyInfo.SetValue(account, value, null);
                        }
-                       long reflectionMs = DateTime.Now.Ticks - start;
-                       float reflectionRatio = (float)reflectionMs / 
directAccessMs;
+            timer.Stop();
+            double reflectionDuration = 1000000 * (timer.Duration / 
(double)TEST_ITERATIONS);
+            double reflectionRatio = reflectionDuration / directAccessDuration;
                        #endregion
 
                        #region ReflectionInvokeMember (slowest)
-            type = account.GetType();
-            start = DateTime.Now.Ticks;
+                       GC.Collect();
+                       GC.WaitForPendingFinalizers();
+
+            timer.Start();
             for (int i = 0; i < TEST_ITERATIONS; i++)
             {
                 type.InvokeMember("Id",
                     BindingFlags.Public | BindingFlags.SetProperty | 
BindingFlags.Instance,
                     null, account, new object[] { value });
             }
-            long reflectionInvokeMemberMs = DateTime.Now.Ticks - start;
-                       float reflectionInvokeMemberRatio = 
(float)reflectionInvokeMemberMs / directAccessMs;
+            timer.Stop();
+            double reflectionInvokeMemberDuration = 1000000 * (timer.Duration 
/ (double)TEST_ITERATIONS);
+            double reflectionInvokeMemberRatio = 
reflectionInvokeMemberDuration / directAccessDuration;
                        #endregion
             
                        // Print results
                        Console.WriteLine("{0} property sets on integer...", 
TEST_ITERATIONS);
-                       Console.WriteLine("Direct access: \t\t{0} ms", 
directAccessMs);
-                       Console.WriteLine("IPropertyAccessor: \t\t{0} ms Ratio: 
{1}", propertyAccessorMs, propertyAccessorRatio);
-                       Console.WriteLine("IBatisNet ReflectionInfo: \t{0} ms 
Ratio: {1}", reflectionInfoMs, reflectionInfoRatio);
-                       Console.WriteLine("ReflectionInvokeMember: \t{0} ms 
Ratio: {1}", reflectionInvokeMemberMs, reflectionInvokeMemberRatio);
-                       Console.WriteLine("Reflection: \t\t\t{0} ms Ratio: 
{1}", reflectionMs, reflectionRatio);
+            Console.WriteLine("Direct access: \t\t{0} ", 
directAccessDuration.ToString("F3"));
+            Console.WriteLine("IPropertyAccessor: \t\t{0} Ratio: {1}", 
propertyAccessorDuration.ToString("F3"), propertyAccessorRatio.ToString("F3"));
+            Console.WriteLine("IBatisNet ReflectionInfo: \t{0} Ratio: {1}", 
reflectionInfoDuration.ToString("F3"), reflectionInfoRatio.ToString("F3"));
+            Console.WriteLine("ReflectionInvokeMember: \t{0} Ratio: {1}", 
reflectionInvokeMemberDuration.ToString("F3"), 
reflectionInvokeMemberRatio.ToString("F3"));
+            Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", 
reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3"));
         }
        
                /// <summary>

Added: 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs?rev=385615&view=auto
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs
 (added)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs
 Mon Mar 13 10:32:04 2006
@@ -0,0 +1,46 @@
+using System;
+using System.ComponentModel;
+using System.Runtime.InteropServices;
+using System.Threading;
+
+namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities
+{
+    public class Timer
+    {
+            [DllImport("Kernel32.dll")]
+                       private static extern bool QueryPerformanceCounter(out 
long lpPerformanceCount);
+
+                       [DllImport("Kernel32.dll")]
+                       private static extern bool 
QueryPerformanceFrequency(out long lpFrequency);
+
+                       private long startTime, stopTime;
+                       private long freq;
+
+                       public Timer()
+                       {
+                               startTime = 0;
+                               stopTime = 0;
+
+                               if (QueryPerformanceFrequency(out freq) == 
false)
+                               {
+                                       throw new Win32Exception();
+                               }
+                       }
+
+                       public void Start()
+                       {
+                               Thread.Sleep(0);
+                               QueryPerformanceCounter(out startTime);
+                       }
+
+                       public void Stop()
+                       {
+                               QueryPerformanceCounter(out stopTime);
+                       }
+
+                       public double Duration
+                       {
+                               get { return (double) (stopTime - 
startTime)/(double) freq; }
+                       }
+    }
+}

Propchange: 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs
------------------------------------------------------------------------------
    svn:keywords = Id LastChangedDate LastChangedBy

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj?rev=385615&r1=385614&r2=385615&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj 
(original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj Mon 
Mar 13 10:32:04 2006
@@ -192,8 +192,15 @@
     <Compile Include="Utilities\HashCodeProvider.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Utilities\Objects\ActivatorFactory.cs" />
+    <Compile Include="Utilities\Objects\ActivatorObjectFactory.cs" />
+    <Compile Include="Utilities\Objects\EmitObjectFactory.cs" />
+    <Compile Include="Utilities\Objects\FactoryBuilder.cs" />
+    <Compile Include="Utilities\Objects\IFactory.cs" />
     <Compile Include="Utilities\Objects\ILPropertyAccessor.cs" />
+    <Compile Include="Utilities\Objects\IObjectFactory.cs" />
     <Compile Include="Utilities\Objects\IPropertyAccessor.cs" />
+    <Compile Include="Utilities\Objects\ObjectFactory.cs" />
     <Compile Include="Utilities\Objects\ObjectProbe.cs">
       <SubType>Code</SubType>
     </Compile>

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs?rev=385615&r1=385614&r2=385615&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs 
Mon Mar 13 10:32:04 2006
@@ -32,10 +32,12 @@
        /// <summary>
        /// A factory that can create objects via IL code
        /// </summary>
-       public class EmitObjectFactory : IObjectFactory
+       public sealed class EmitObjectFactory : IObjectFactory
        {
                private IDictionary _cachedfactories = new HybridDictionary();
                private FactoryBuilder _factoryBuilder = null;
+               private object _padlock = new object();
+
 
                /// <summary>
                /// 
@@ -55,10 +57,17 @@
                public IFactory CreateFactory(Type typeToCreate)
                {
                        IFactory factory = (IFactory) 
_cachedfactories[typeToCreate];
-                       if (null == factory)
+                       if (factory == null)
                        {
-                               factory = 
_factoryBuilder.CreateFactory(typeToCreate);
-                               _cachedfactories[typeToCreate] = factory;
+                               lock (_padlock)
+                               {
+                                       factory = (IFactory) 
_cachedfactories[typeToCreate];
+                                       if (factory == null) // double-check
+                                       {
+                                               factory = 
_factoryBuilder.CreateFactory(typeToCreate);
+                                               _cachedfactories[typeToCreate] 
= factory;
+                                       }
+                               }
                        }
                        return factory;
                }

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs?rev=385615&r1=385614&r2=385615&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs 
(original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs 
Mon Mar 13 10:32:04 2006
@@ -28,7 +28,7 @@
 namespace IBatisNet.Common.Utilities.Objects
 {
        /// <summary>
-       /// Description résumée de ObjectFactory.
+       /// A factory to create objects 
        /// </summary>
        public class ObjectFactory : IObjectFactory
        {


Reply via email to