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

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

新規登録して質問してみよう
ただいま回答率
85.47%
C#

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

WPF

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

Q&A

解決済

2回答

1895閲覧

【WPF / Prism】VM に自作インターフェースがDI注入されない

neko_usagi

総合スコア10

C#

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

WPF

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

0グッド

0クリップ

投稿2022/02/22 01:52

編集2022/02/23 04:24

《困っていること》
prism full appを参考に、インターフェースを自作し、ViewModelにDI注入したいが、うまくいかない。

《やりたいこと》
・EmployeeListViewModelにIEmployeeServiceを入れ、GetEmployees()でデータを取得したい。

C#

1 public class EmployeeListViewModel : RegionViewModelBase 2 { 3 public EmployeeListViewModel(IRegionManager regionManager, IEmployeeService employeeService) : base(regionManager) 4 { 5 // 理想 6 employeeService.GetEmployees(); 7 } 8 9 public ReactiveCollection<DtEmployee> EmployeeList { get; set; } = new ReactiveCollection<DtEmployee>(); 10 } 11

《現状》
・IEmployeeServiceをコンストラクタの引数に指定することで、コンストラクタ内を通らなくなる。
・IEmployeeServiceを消すと、コンストラクタは実行される。

コードは以下です。

app.xaml.cs

C#

1namespace EES 2{ 3 /// <summary> 4 /// Interaction logic for App.xaml 5 /// </summary> 6 public partial class App 7 { 8 protected override Window CreateShell() 9 { 10 return Container.Resolve<MainWindow>(); 11 } 12 13 protected override void RegisterTypes(IContainerRegistry containerRegistry) 14 { 15 containerRegistry.RegisterSingleton<IEmployeeService, EmployeeService>(); 16 } 17 18 protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) 19 { 20 moduleCatalog.AddModule<EmployeeInfoModule>(); 21 } 22 } 23}

EmployeeInfoModule.cs

C#

1namespace EES.Modules.EmployeeInfo 2{ 3 public class EmployeeInfoModule : IModule 4 { 5 private readonly IRegionManager _regionManager; 6 7 public EmployeeInfoModule(IRegionManager regionManager) 8 { 9 _regionManager = regionManager; 10 } 11 12 public void OnInitialized(IContainerProvider containerProvider) 13 { 14 _regionManager.RequestNavigate(RegionNames.ContentRegion, "EmployeeList"); 15 } 16 17 public void RegisterTypes(IContainerRegistry containerRegistry) 18 { 19 containerRegistry.RegisterForNavigation<EmployeeList>(); 20 } 21 } 22}

EmployeeListViewModel.cs

C#

1namespace EES.Modules.EmployeeInfo.ViewModels 2{ 3 public class EmployeeListViewModel : RegionViewModelBase 4 { 5 public EmployeeListViewModel(IRegionManager regionManager, IEmployeeService employeeService) : base(regionManager) 6 { 7 this.EmployeeList.Add(new DtEmployee() { EmployeeId = 1, Name = "¼–{" }); 8 this.EmployeeList.Add(new DtEmployee() { EmployeeId = 2, Name = "ŽR“c" }); 9 } 10 11 public ReactiveCollection<DtEmployee> EmployeeList { get; set; } = new ReactiveCollection<DtEmployee>(); 12 } 13}

IEmployeeService.cs

C#

1using EES.Database.Entities; 2using System; 3using System.Collections.ObjectModel; 4 5namespace EES.Services.Interfaces 6{ 7 public interface IEmployeeService 8 { 9 ObservableCollection<DtEmployee> GetEmployees(); 10 } 11}

EmployeeService.cs

C#

1namespace EES.Service 2{ 3 public class EmployeeService : IEmployeeService 4 { 5 6 private readonly ITransactionContext _transactionContext; 7 8 public EmployeeService(ITransactionContext transactionContext) 9 { 10 _transactionContext = transactionContext; 11 } 12 13 public ObservableCollection<DtEmployee> GetEmployees() 14 { 15 ObservableCollection<DtEmployee> list = new ObservableCollection<DtEmployee>(); 16 17 list.Add(new DtEmployee() { EmployeeId = 1, Name = "¼–{X" }); 18 list.Add(new DtEmployee() { EmployeeId = 2, Name = "ŽR“cX" }); 19 20 return list; 21 22 } 23 } 24}

よろしくお願いいたします。

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

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

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

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

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

hihijiji

2022/02/22 08:28

単なる無償のデバッグ作業依頼になってます。 ここに載せられる程度にまでコードを絞り込んでください。
neko_usagi

2022/02/23 04:24

失礼いたしました。再度入力いたしました。
guest

回答2

0

自己解決

TN8001から教えていただき解決しました。

app.xaml.csにITransactionContextを登録することで、
解決いたしました。

ありがとうございます!

投稿2022/02/24 01:25

neko_usagi

総合スコア10

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

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

TN8001

2022/02/24 09:53

回答と同内容の自己解決は低評価を受けることがあります。 お礼は回答のコメントに、 補足が必要と思ったら、 * 簡単なものなら回答のコメントに * コード等がありコメントでは書きにくいものは自己回答に * 重要な内容で注意を引きたい場合は質問へ追記 とされていることが多い気がします(自己回答と追記どちらが望ましいのかちょっとわかりませんが^^; 回答が複数ついた場合は一番わかりやすいと思ったものを、内容に差がなくどれが一番か選べないような時は回答日時が早いものがBAされていることが多いです。 [ヘルプ](https://teratail.com/help)
guest

0

・IEmployeeServiceをコンストラクタの引数に指定することで、コンストラクタ内を通らなくなる。

それ以前にEmployeeServiceTransactionContextのコンストラクタも通っていません。
IEmployeeServiceもDIに登録してください。
ITransactionContextもDIに登録してください。

[C#][WPF][EF]Entity Framework で DB にアクセスする際コンテキストのオブジェクトが自動的に注入されるよう DI 機能を WPF アプリに実装したい

投稿2022/02/22 13:06

編集2022/02/23 05:25
TN8001

総合スコア9357

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

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

neko_usagi

2022/02/23 04:27

app.xaml.cs内にcontainerに登録しています。 TransactionContextに関しては、次の段階で実装予定でしたので、まだ入れていませんでした。
TN8001

2022/02/23 05:24

すいません失礼しました^^; > IEmployeeServiceもDIに登録してください。 「ITransactionContext もDIに登録してください。」の間違いでした。
TN8001

2022/02/23 05:37

> TransactionContextに関しては、次の段階で実装予定でしたので、まだ入れていませんでした。 public class EmployeeService : IEmployeeService { public EmployeeService() { } } こうなっているのであれば別にそれでいいのですが、 public class EmployeeService : IEmployeeService { public EmployeeService(ITransactionContext transactionContext) { /* */ } } こうであるなら、ITransactionContextを解決できる必要があります。
neko_usagi

2022/02/24 01:04

ありがとうございます!動きました! 確かに考えて見ればそうですよね。ITransactionContext解決しないとでしたね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問