##悩んでいる事
DIコンテナの使い方を勉強していて、2点分からない事があります。
質問1.
DIコンテナは普通どこで定義するのが一般的でしょうか。
私の理解では、Appクラス内に定義するべきだと考えています。
根拠として、PrismテンプレートのXamarin Unityを選択した場合に
NavigationPageに関するDIコンテナの記述がAppクラスに記述されている事と、
ソリューション全体で統一されたインスタンスの生成をするのであればどこからでもアクセスできるAppクラスに書いておく方が妥当だと思われるからです。
質問2.
DIコンテナでResolveメソッドを呼んでインスタンスを生成する場合に、毎回新しいインスタンスを生成させるにはどうすれば良いのでしょうか。
現在、App.xaml.csには以下の様に記述しています。
C#
1 public partial class App : Application 2 { 3 #region プロパティ 4 5 public static IUnityContainer Container; 6 7 #endregion 8 9 protected override void OnStartup(StartupEventArgs e) 10 { 11 base.OnStartup(e); 12 13 var bootstrapper = new Bootstrapper(); 14 bootstrapper.Run(); 15 16 //DIコンテナの生成 17 Container = new UnityContainer(); 18 19 Container.RegisterInstance(new FileInfo(Path.ChangeExtension(Path.GetTempFileName(), Extention.Xlsx))); 20 Container.RegisterInstance(new Font(Fonts.MS_PGothic, 11, System.Drawing.FontStyle.Regular)); 21 Container.RegisterInstance(new ExcelPackage(new FileInfo(Path.ChangeExtension(Path.GetTempFileName(), Extention.Xlsx)))); 22 } 23 }
また、DIコンテナの呼び出し部分では以下の様にしています。
C#
1using (var excelPackage = App.Container.Resolve<ExcelPackage>()) 2{ 3 App.Container.RegisterType<ILanguageDictionary, LanguageDictionaryExcel>( 4 new InjectionConstructor( 5 "hoge", 6 controlIDWithCaptionDic, 7 excelPackage, 8 App.Container.Resolve<Font>())); 9 var languageDictionary = App.Container.Resolve<ILanguageDictionary>(); //インスタンスの取得 10 var crLanguageDictionary = languageDictionary.CreateLanguageDictionary(); 11} 12
ボタンを押すたびにエクセルを新しく作って指定したデータを出力するという処理です。
この処理自体は一度目は正しく動いてくれますが、Resolveメソッドを呼んだ結果が1度目と同じインスタンスが使いまわされている(?)為、意図した動作をしてくれません。
Resolveメソッドを呼び出す度に新しいインスタンスを生成して欲しいと思っています。
色々と調べた結果、LifetimeManageの管理が出来ていないようだと思いましたが、
LifetimeManagerを指定せずにRegisterTypeを実行するとデフォルトで毎回インスタンスを行うTransientLifetimeManagerが設定されているという説明を見つけました。
どうにかしてResolveメソッドを実行した際に新しいインスタンスを生成して欲しいのですが、
どのようにすればよいのでしょうか。
回答1件
あなたの回答
tips
プレビュー