<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>>$B$H$j$"$($:(B"$BF0E*$J@\B3(B"$B$NMW7o$O4pK\E*$K$3$NFs$D!"$G$9$h$M!)(B<br>
>$B#1!%%F!<%V%k9=B$$O8GDj(B<br>>$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>> $B$3$N!V(BIDataSource$B<BAu%/%i%9$N%$%s%9%?%s%9!J%G!<%?%=!<%9!K!W$,(B<br><div>
> $BBg2<$5$sB&$G:n$C$F$$$?$@$/$3$H$K$J$kItJ,$K$J$j$^$9!#(B<br>
> $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> class TxSetupper<br> {<br> private SelectableDataSourceProxyWithDictionary _dsProxy;<br><br>
public SelectableDataSourceProxyWithDictionary DSProxy<br> {<br> get { return _dsProxy; }<br> set { _dsProxy = value; }<br> }<br><br> public String CreateTxDataSource()<div class="Ih2E3d">
<br>
{<br> // $B@\B3J8;zNs$r:n@.$9$k(B<br> SQLiteConnectionStringBuilder conn = new SQLiteConnectionStringBuilder();<br><br></div> // $B0l0U$J(BDB$B%U%!%$%kL>$r$3$3$G:n@.(B<br> String strDBName = Guid.NewGuid().ToString();<br>
conn.DataSource = strDBName + ".SQ3";<div class="Ih2E3d"><br> conn.FailIfMissing = false;<br> conn.SyncMode = SynchronizationModes.Normal;<br> conn.DateTimeFormat = SQLiteDateFormats.ISO8601;<br>
conn.CacheSize = 2000;<br> conn.PageSize = 1024;<br> conn.LegacyFormat = true;<br> conn.DefaultTimeout = 30;<br><br> // $B%G!<%?%W%m%P%$%@(B<br> DataProvider dp = new DataProvider();<br>
dp.ConnectionType = "System.Data.SQLite.SQLiteConnection";<br> dp.CommandType = "System.Data.SQLite.SQLiteCommand";<br> dp.ParameterType = "System.Data.SQLite.SQLiteParameter";<br>
dp.DataAdapterType = "System.Data.SQLite.SQLiteDataAdapter";<br> <br></div> // $B%G!<%?%=!<%9:n@.(B<div class="Ih2E3d"><br> IDataSource dataSource = new TxDataSource(dp, conn.ToString());<br>
</div> _dsProxy.RegistDataSource(strDBName, dataSource);<br>
<br> // TransactionContext<br> TransactionContext txContext = new TransactionContext();<br> txContext.DataSouce = dataSource;<br> txContext.IsolationLevel = IsolationLevel.ReadCommitted;<br>
<br> // TransactionContext$B$r;HMQ$9$k%G!<%?%=!<%9$K$b@_Dj(B<br> Type dataSourceType = dataSource.GetType();<br> if (typeof(SelectableDataSourceProxyWithDictionary).IsAssignableFrom(<br> dataSourceType))<br>
{<br> ((SelectableDataSourceProxyWithDictionary)dataSource).SetTransactionContext(<br> txContext);<br> }<br> else if (typeof(TxDataSource).IsAssignableFrom(dataSourceType))<br>
{<br> ((TxDataSource)dataSource).Context = txContext;<br> }<br><br> // TransactionInterceptor<br> LocalRequiredTxHandler handler = new LocalRequiredTxHandler();<br>
handler.Context = txContext;<br> IMethodInterceptor _transactionInterceptor = new TransactionInterceptor(handler);<br> ((TransactionInterceptor)_transactionInterceptor).TransactionStateHandler<br>
= txContext;<br> <br> return strDBName;<br> }<br> }<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>> $BDI2C$7$?%G!<%?%=!<%9$r;H$$$?$$>l9g$O(B<br>
> SelectableDataSourceProxyWithDictionary#SetDataSourceName$B%a%=%C%I$r8F$S!"(B<br><div>
> $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> class Program<div class="Ih2E3d"><br> {<br> static void Main(string[] args)<br> {<br></div>
QuillInjector injector = QuillInjector.GetInstance();<br>
<br> LibraryLogic logic = new LibraryLogic();<br> TxSetupper txSetup = new TxSetupper();<br> <br> injector.Inject(logic);<br> injector.Inject(txSetup);<br><br> String strDBName = txSetup.CreateTxDataSource();<br>
txSetup.DSProxy.SetDataSourceName(strDBName);<br> bool bContains<br> = txSetup.DSProxy.DataSourceCollection.ContainsKey(strDBName);<br><br> Library lib = new Library("TestLib", "Foo");<br>
<br> logic.Dao.Insert(lib);<br> }<br> }<br>---------------<br>$B$3$3$G!"(BLibraryLogic$B%/%i%9$O!"(B<br>---------------<br> [Implementation]<br> class LibraryLogic<br> {<br> private ILibraryDao _dao;<br>
<br> public ILibraryDao Dao<br> {<br> get { return _dao; }<br> set { _dao = value; }<br> }<br><br> public int Insert(Library lib)<br> {<br> Console.WriteLine("$B"&(BInsert$B<B9T$7$^$9(B");<br>
return _dao.Insert(lib);<br> }<br> }<br>--------------------<br>$B$N$h$&$K$J$C$F$*$j!"(BDao$B$O!"(B<br>--------------------<br> [Implementation]<div class="Ih2E3d"> [Bean(typeof(Library))]<br> public interface ILibraryDao<br>
{<br></div>
[S2Dao]<br> [Transaction]<br> int Insert(Library library);<br> }<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>>$B$9$$$^$;$s!#(B<br>>$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>