<div dir="ltr">$B>.C+MM!"(B<br>$B$*@$OC$K$J$C$F$$$^$9!"Bg2<$G$9!#(B<br>$B$*K;$7$$$H$3$m!">\:Y$J@bL@$r$D$1$F$$$?$@$-!"(B<div dir="ltr">$B62=L$7$F$*$j$^$9!#$"$j$,$H$&$4$6$$$^$9!#(B<div class="Ih2E3d">$B!JEj9F$7$h$&$H$7$?$H$3$m!"%a!<%k$,D9$9$.$k$H(BML$B%7%9%F%`$KE\$i$l$?$N$G!"$$$^$^$G$N$d$j$H$j$r:o=|$7$F$*$j$^$9!#$4N;>5$/$@$5$$!#!K(B<br><br>&gt;$B$H$j$"$($:(B&quot;$BF0E*$J@\B3(B&quot;$B$NMW7o$O4pK\E*$K$3$NFs$D!"$G$9$h$M!)(B<br>
&gt;$B#1!%%F!<%V%k9=B$$O8GDj(B<br>&gt;$B#2!%@\B3@h$O:G=i$OB8:_$7$J$$!JF0E*$KDI2C$7$F$d$kI,MW$,$"$k!K(B<br><br></div>
$B$O$$!"$=$NDL$j$G$9!#(B<br>
$B$3$NMW7o$r$b$C$H$O$C$-$jDs<($9$k$Y$-$G$7$?!"$9$_$^$;$s!#(B<br><br>$B>.C+$5$s$+$iJV?.$r$$$?$@$/A0$K!"8!>Z%3!<%I$r=q$$$F$*$j$^$7$?!#(B<br>$B7k2L$+$i?=$7>e$2$k$H!";d$,=q$$$?8!>Z%3!<%I$O$^$@$&$^$/F0:n$7$F$*$j$^$;$s!#(B<br><br>Dicon$B$N@_DjFbMF$d(BSelectableDataSourceProxyWithDictionary$B%/%i%9$N%=!<%9$rFI$s$G$_$F!"$3$&$$$&=hM}$r=q$1$P$h$$$N$+$J$!$HA[A|$7$F=q$$$?%3!<%I$H!">.C+$5$s$+$i$$$?$@$$$?@bL@$,$@$$$?$$F1$8$G$"$k$N$G!"Bg$^$+$JN.$l$O$"$C$F$$$k$H$O;W$&$N$G$9$,!D!#(B<br>


$BA4BNE*$J%=!<%9%3!<%I$rE=$C$F$7$^$$$?$$$N$G$9$,!"$A$g$C$HD9$/$J$j$=$&$J$N$G!"ItJ,E*$K<ALd$5$;$F$$$?$@$-$^$9$H!"(B<div class="Ih2E3d"><br><br>&gt; $B$3$N!V(BIDataSource$B<BAu%/%i%9$N%$%s%9%?%s%9!J%G!<%?%=!<%9!K!W$,(B<br><div>
&gt; $BBg2<$5$sB&$G:n$C$F$$$?$@$/$3$H$K$J$kItJ,$K$J$j$^$9!#(B<br>
&gt; $B!J(BTxDataSource$B$b(BIDataSource$B$r<BAu$7$F$$$k%/%i%9$G$9!K(B</div><br></div>$B$3$l$K$D$$$F!"0J2<$N$h$&$J%3!<%I$r=q$$$F$_$^$7$?!#(B<br>---------------<br>&nbsp;&nbsp;&nbsp; class TxSetupper<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private SelectableDataSourceProxyWithDictionary _dsProxy;<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public SelectableDataSourceProxyWithDictionary DSProxy<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return _dsProxy; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { _dsProxy = value; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String CreateTxDataSource()<div class="Ih2E3d">
<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // $B@\B3J8;zNs$r:n@.$9$k(B<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLiteConnectionStringBuilder conn = new SQLiteConnectionStringBuilder();<br><br></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // $B0l0U$J(BDB$B%U%!%$%kL>$r$3$3$G:n@.(B<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strDBName = Guid.NewGuid().ToString();<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.DataSource = strDBName + &quot;.SQ3&quot;;<div class="Ih2E3d"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.FailIfMissing = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.SyncMode = SynchronizationModes.Normal;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.DateTimeFormat = SQLiteDateFormats.ISO8601;<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.CacheSize = 2000;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.PageSize = 1024;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.LegacyFormat = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.DefaultTimeout = 30;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // $B%G!<%?%W%m%P%$%@(B<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataProvider dp = new DataProvider();<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.ConnectionType = &quot;System.Data.SQLite.SQLiteConnection&quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.CommandType = &quot;System.Data.SQLite.SQLiteCommand&quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.ParameterType = &quot;System.Data.SQLite.SQLiteParameter&quot;;<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp.DataAdapterType = &quot;System.Data.SQLite.SQLiteDataAdapter&quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // $B%G!<%?%=!<%9:n@.(B<div class="Ih2E3d"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IDataSource dataSource = new TxDataSource(dp, conn.ToString());<br>
</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _dsProxy.RegistDataSource(strDBName, dataSource);<br>

<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; TransactionContext<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransactionContext txContext = new TransactionContext();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txContext.DataSouce = dataSource;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txContext.IsolationLevel = IsolationLevel.ReadCommitted;<br>


<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; TransactionContext$B$r;HMQ$9$k%G!<%?%=!<%9$K$b@_Dj(B<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type dataSourceType = dataSource.GetType();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (typeof(SelectableDataSourceProxyWithDictionary).IsAssignableFrom(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataSourceType))<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((SelectableDataSourceProxyWithDictionary)dataSource).SetTransactionContext(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txContext);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (typeof(TxDataSource).IsAssignableFrom(dataSourceType))<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((TxDataSource)dataSource).Context = txContext;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; TransactionInterceptor<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LocalRequiredTxHandler handler = new LocalRequiredTxHandler();<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler.Context = txContext;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IMethodInterceptor _transactionInterceptor = new TransactionInterceptor(handler);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((TransactionInterceptor)_transactionInterceptor).TransactionStateHandler<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = txContext;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return strDBName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>---------------<br>$B$3$s$J46$8$G9g$C$F$$$^$9$G$7$g$&$+!)(B<br>$B$3$N(BTxSetupper$B%/%i%9$N(BTxSetupper#CreateTxDataSource$B%a%=%C%I$r8F$s$@$"$H$G!"(B<br><br>&gt; $BDI2C$7$?%G!<%?%=!<%9$r;H$$$?$$>l9g$O(B<br>



&gt; SelectableDataSourceProxyWithDictionary#SetDataSourceName$B%a%=%C%I$r8F$S!"(B<br><div>
&gt; $B0z?t$K(BRegisterDataSource$B$G@_Dj$7$?%G!<%?%=!<%9L>$r;XDj$7$F2<$5$$!#(B</div><br>$B$r$d$j!"(BDao$B$GDj5A$7$?%a%=%C%I$r8F$s$G$$$^$9!#!J2<5-$N$H$*$j!K(B<br>---------------<br>&nbsp;&nbsp;&nbsp; class Program<div class="Ih2E3d"><br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QuillInjector injector = QuillInjector.GetInstance();<br>

<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LibraryLogic logic = new LibraryLogic();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TxSetupper txSetup = new TxSetupper();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; injector.Inject(logic);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; injector.Inject(txSetup);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strDBName = txSetup.CreateTxDataSource();<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txSetup.DSProxy.SetDataSourceName(strDBName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool bContains<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = txSetup.DSProxy.DataSourceCollection.ContainsKey(strDBName);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Library lib = new Library(&quot;TestLib&quot;, &quot;Foo&quot;);<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logic.Dao.Insert(lib);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>---------------<br>$B$3$3$G!"(BLibraryLogic$B%/%i%9$O!"(B<br>---------------<br>&nbsp;&nbsp;&nbsp; [Implementation]<br>&nbsp;&nbsp;&nbsp; class LibraryLogic<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private ILibraryDao _dao;<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ILibraryDao Dao<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return _dao; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { _dao = value; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int Insert(Library lib)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;$B"&(BInsert$B<B9T$7$^$9(B&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _dao.Insert(lib);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>--------------------<br>$B$N$h$&$K$J$C$F$*$j!"(BDao$B$O!"(B<br>--------------------<br>&nbsp;&nbsp;&nbsp; [Implementation]<div class="Ih2E3d">&nbsp;&nbsp;&nbsp; [Bean(typeof(Library))]<br>&nbsp;&nbsp;&nbsp; public interface ILibraryDao<br>
&nbsp;&nbsp;&nbsp; {<br></div>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [S2Dao]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Transaction]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int Insert(Library library);<br>&nbsp;&nbsp;&nbsp; }<br>--------------------<br>$B$H$J$C$F$*$j$^$9!#(B<br>$B!t7k6I!"$[$H$s$I%=!<%9E=$C$A$c$C$?!D(B<br><br>&gt;$B$9$$$^$;$s!#(B<br>&gt;$B;d!"$:$C$H(BQuill$B$r;H$&$3$HA0Ds$KOC$r$7$F$7$^$C$F$$$^$9$M!#(B<br><br>$B$O$O!"(B<br>
$B@5D>!"(BS2Container.NET$B!)(BQuill$B!)$H$A$g$C$H;d$b:.Mp$7$F$$$k$N$G$9$,!"(BQuill$B$r;H$($C$F$3$H$J$N$+$J$!$H!"$J$s$H$J$/M}2r$7$F$$$^$9!#(B<br>
$B$*$^$1$K(BAOP$B$d(BDI$B$b:#2s?($l$k$N$,;O$a$F$J$N$G!"$+$J$jAG$CF\68$J<ALd$r7+$jJV$7$F$$$k$h$&$J5$$,$9$k$N$G$9$,!"$4MF<O$/$@$5$$!#(B<br>$B$*K;$7$$$N$K$9$_$^$;$s!"D9$/$J$j$^$7$?$,>e5-$G<ALd$7$?$3$H$K2?$+2sEz$r$$$?$@$1$k$H9,$$$G$9!#(B</div></div>