質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

12869閲覧

DIコンテナの使い方について

ngAwf

総合スコア27

DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

3クリップ

投稿2017/09/10 12:12

##悩んでいる事
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メソッドを実行した際に新しいインスタンスを生成して欲しいのですが、
どのようにすればよいのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2017/09/10 22:56

> LifetimeManagerを指定せずにRegisterTypeを実行するとデフォルトで毎回インスタンスを ← これだとダメなのですか?
guest

回答1

0

ベストアンサー

質問1.

必ず実行されるところに書く。必ず実行しないと、取れないので。

素直にPrismのサンプルを見ればいいじゃない。
https://github.com/PrismLibrary/Prism-Samples-Wpf
https://github.com/PrismLibrary/Prism-Samples-Windows

質問2.

毎回新しいインスタンスがほしいなら、、DIを使わず、毎回、newすればいいのでは???

複数のクラス間で、オブジェクトを疎に共有したいときに使うのが、DIですよ?
調べて知っていると思いますが、制御の反転のためですよ。
https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E3%81%AE%E5%8F%8D%E8%BB%A2

毎回同じことをするのに、長いのを書きたくないなら、静的メソッドを作ればいいだけでは?

投稿2017/09/12 10:12

kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ngAwf

2017/09/12 12:47

いつもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問