<div dir="ltr">ohattaさん<div><br></div><div>小谷(koyak)です。</div><div><br></div><div>色々と書いてしまいましたが、Quillの方で対応できそうなところを対応してみました。</div><div><br></div><div>Interfaceからの場合でもImplementsを直接指定する場合でも</div><div>実装型が同じであれば同じインスタンスを返すようにしています。</div><div><br></div><div>可能であれば、ブランチの最新コードを取得し、試してみていただけないでしょうか。</div><div><a href="https://github.com/seasarorg/s2container.net/tree/s2container.net-v1.3-for.NET2.0">https://github.com/seasarorg/s2container.net/tree/s2container.net-v1.3-for.NET2.0</a><br></div><div><a href="https://github.com/seasarorg/s2container.net/tree/Branch_9fa203d7d48a682597ac03f198b66ccdd9997227">https://github.com/seasarorg/s2container.net/tree/Branch_9fa203d7d48a682597ac03f198b66ccdd9997227</a><br></div><div><br></div><div>以上です。</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015年10月10日 22:52 kotani.k <span dir="ltr">&lt;<a href="mailto:keikotani926@gmail.com" target="_blank">keikotani926@gmail.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>ohattaさん</div><div><br></div><div>小谷(koyak)です。</div><div><br></div><div>InjectionMapからinterfaceA -&gt; implementsB</div><div>といく場合も</div><div>Implementation属性から implementsB -&gt; implementsB</div><div>といく場合もDynamicProxyに対してはimplementsBとして</div><div>インスタンスを作らせにいくので、その辺りに原因がありそうですね。</div><div>恐らく先にInjectされた方が正しく動いているのではないかと思います。</div><div><br></div><div>Quill側でできそうな対応としては、</div><div>Implements(引数なし)でも、そのクラスがinterfaceの実装であれば</div><div>まずinterfaceでコンポーネントを探すようにする</div><div>or</div><div>Implements(引数なし)の場合、その型でインスタンスを作れなければ</div><div>interfaceの実装かチェック、interfaceの実装であればそちらで</div><div>コンポーネントを探すようにする</div><div><br></div><div>あたりが考えられますが、それはそれで利用の仕方によっては</div><div>予期せぬ動きをすることになると思うので対応しにくいですね。</div><div><br></div><div>ohattaさんが仰る通り、interfaceを実装されているのであれば、</div><div>interfaceを使ってでインスタンス変数を定義していただく方が、</div><div>モックを使っていた場合など、使用する実装クラスを別のものに入れ替えたいときに</div><div>変更もれがなくなる意味としても、intarfaceの存在意義としても良いのでは</div><div>ないかと思います。</div><div>(それは百もご承知の上でImplemtnsBを使う必要があるのだと思われますが。。。)</div><div><br></div><div>回避策としてはohattaさんが実施なさっている方法の他に、</div><div>MethodBもInterfaceAのメソッドにする(ExecuterCにはinterfaceでインスタンス変数をもつ)。</div><div>または、以下のような設計にすれば、DynamicProxyにインスタンスを作らせる型が</div><div>InjectionMapに登録しているものとは別になるので動作するのではないかと思います。</div><div><br></div><div>public class ImplementsB&#39; : InterfaceA {</div><div><span style="white-space:pre-wrap">        </span>public void MethodA(){</div><div><span style="white-space:pre-wrap">                </span>XXXXXX</div><div><span style="white-space:pre-wrap">        </span>}</div><div>}</div><div>(InjectionMapにはInterfaceA-ImplementsB&#39;で登録)</div><div><br></div><div>[Implementation]</div><div>public class ImplementsD : ImplementsB&#39; {<span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>public void MethodB(){</div><div><span style="white-space:pre-wrap">                </span>XXXXX</div><div><span style="white-space:pre-wrap">        </span>}</div><div>}</div><div>(もしくはInterfaceAの実装とし、</div><div> protected InterfaceA huga;</div><div> public void MethodA() { huga.MethodA(); }</div><div> とする)</div><div><br></div><div>[Implementation]</div><div>public class ExecutorC&#39;</div><div>{</div><div>  protected ImplementsD hoge;</div><div>  public void Execute()</div><div>  {</div><div>    this.hoge.MethodB(); </div><div>  }</div><div>}</div><div><br></div><div>以上です。</div></div><div class="gmail_extra"><br><div class="gmail_quote">2015年10月8日 10:35 ohatta <span dir="ltr">&lt;<a href="mailto:ohatta+seasar.org.you@gmail.com" target="_blank">ohatta+seasar.org.you@gmail.com</a>&gt;</span>:<div><div class="h5"><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">みなさま<div>はじめまして、いつもお世話になります。pull requestをさせていただいた畑中です。<br>取込ありがとうございました。<br><br>さて、pull requestをしておいて非常に申し訳ないのですが<br>1.3.20においてInjectionMapを使った特殊なケースで不具合が出る場合がありますので<div>その報告と回避策のご相談をさせてください。<br><br>interface InterfaceA{<br>  void MethodA();<br>}<br><br>[Implementation]<br>public class ImplementsB : InterfaceA<br>{<br>  protected ImplementsC ImplementsC;<br>  public void MethodB()<br>  {<br>    this.ImplementsC.MethodC();<br>  }<br>}<br><br>というクラスがあり、<br>QuillInjector.GetInstance().InjectionMap.Add(typeof(InterfaceA), typeof(ImpelmentsB));<br>と登録しておきながら<br><br>[Implementation]<br>public class ExecutorC<br>{<br>  protected ImplementsB ImplementsB;<br>  public void Execute()<br>  {<br>    this.ImplementsB.MethodB(); <br>  }<br>}<br><br>上記のようにInterfaceAではなく<br>ImplmenetBを直接Injectしてもらう実装があると<br>このImplementsBインスタンスが正しく初期化されない場合があります。<br>具体的には<br>  ImplementsB.ImplementsCにインスタンスがInjectされない場合があります。</div><div>今回の変更でDynamicProxyインスタンスを共有したことに原因があると思いますが</div><div>完全には原因をつかめていません。</div><div><div><div><br></div><div>回避策として</div><div>public class ExecutorC<br>{<br>  protected InterfaceA ImplementsB;<br></div>・・・・</div><div><br>と変更することで問題なく動くことを確認しました。<br><br></div><div>・そもそもinterfaceを定義するならinterfaceでInjectしてもらうのが正しい<br>・DynamicProxyのメモリリークがクリティカルになっている<br>という理由でわれわれのプロジェクトは上記の回避策で対応していますが、<br></div><div>こちら、大きな問題になりそうでしょうか?</div><div><br></div><div>一度ご検討いただければと思います。</div><div><br></div><div>以上、よろしくお願いします。<br><br><br><div class="gmail_quote"><div dir="ltr">2015年9月25日(金) 0:33 kotani.k &lt;<a href="mailto:keikotani926@gmail.com" target="_blank">keikotani926@gmail.com</a>&gt;:<br></div></div></div></div><div dir="ltr"><div><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr"><span style="font-size:14px">小谷(koyak)です。</span><br style="font-size:14px"><br style="font-size:14px"><span style="font-size:14px"><span>S2Container</span>/S2Dao 1.4.1, 1.3.20を<span>リリース</span>しました。</span><div><font face="arial, sans-serif" style="font-size:14px"><a href="http://s2container.net.seasar.org/ja/download.html" target="_blank">http://<span>s2container</span>.<span>net</span>.seasar.org/ja/download.html</a><br></font><div style="font-size:14px"><br></div><div style="font-size:14px">1.4.1は.NET4.0以上、1.3.20は.NET3.5以前で動作します。</div><div style="font-size:14px">また、動作はVisualStudio2013上で確認しています。</div><div style="font-size:14px"><br>変更点は下記の通りです。</div><div><br><div style="font-size:14px"><font face="arial, sans-serif"><span>S2Container</span>.<span>NET</span> 1.4.1、1.3.20</font></div><div style="font-size:14px"><font face="arial, sans-serif">*** Bug</font></div><div><span style="font-size:12.96px;color:rgb(0,0,0);font-family:verdana,arial,helvetica,sans-serif;line-height:16.848px">[Issue#7] QuillInjector#Destroy()で破棄されないオブジェクトがある不具合修正。</span></div><div><font color="#000000" face="verdana, arial, helvetica, sans-serif"><span style="font-size:12.96px;line-height:16.848px">(プルリクエストをいただいた分の反映です(ありがとうございました!))</span></font></div><div><br></div><div>*** Improvement</div><div><span style="color:rgb(0,0,0);font-family:verdana,arial,helvetica,sans-serif;font-size:12.96px;line-height:16.848px">[Issue#3] Quillの<a href="http://ODP.NET" target="_blank">ODP.NET</a>管理対象ドライバへの対応(1.4.1のみ)</span></div><div style="font-size:14px"><font face="arial, sans-serif"><br></font></div><div style="font-size:14px"><font face="arial, sans-serif">S2DaoNET 1.4.1、1.3.20</font></div><div style="font-size:14px">変更なし</div></div><div style="font-size:14px"><br></div><div style="font-size:14px">以上です。</div></div></div></div></div>
_______________________________________________<br>
seasar-dotnet mailing list<br>
<a href="mailto:seasar-dotnet@ml.seasar.org" target="_blank">seasar-dotnet@ml.seasar.org</a><br>
<a href="https://ml.seasar.org/mailman/listinfo/seasar-dotnet" rel="noreferrer" target="_blank">https://ml.seasar.org/mailman/listinfo/seasar-dotnet</a><br>
</blockquote></div></div></div></div></div></div>
<br>_______________________________________________<br>
seasar-dotnet mailing list<br>
<a href="mailto:seasar-dotnet@ml.seasar.org" target="_blank">seasar-dotnet@ml.seasar.org</a><br>
<a href="https://ml.seasar.org/mailman/listinfo/seasar-dotnet" rel="noreferrer" target="_blank">https://ml.seasar.org/mailman/listinfo/seasar-dotnet</a><br>
<br></blockquote></div></div></div><br></div>
</blockquote></div><br></div>