前提・実現したいこと
Microsoft.Extensions.DependencyInjectionを使用してDIを行おうとしています。
コンストラクタにパラメータを持つクラス(Sample)をForm1にInjectionしようとしているのですが
以下の記述だと呼び出し側で固定で値("abc")が設定されることになります。
この"abc"の値を、Form1側で動的に指定できないでしょうか?
Program
1[STAThread] 2private static void Main() 3{ 4 var serviceCollection = new ServiceCollection(); 5 serviceCollection.AddTransient<Form1>(); 6 // これで Sampleにパラメータ"abc"を渡してInjectionされる 7 serviceCollection.AddTransient<ISample, Sample>(_ => new Sample("abc")); 8 9 var provider = serviceCollection.BuildServiceProvider(); 10 11 Application.EnableVisualStyles(); 12 Application.SetCompatibleTextRenderingDefault(false); 13 Application.Run(provider.GetRequiredService<Form1>()); 14}
Form1
1using System.Windows.Forms; 2 3namespace WindowsFormsApp17 4{ 5 public partial class Form1 : Form 6 { 7 public Form1(ISample sample) 8 { 9 InitializeComponent(); 10 } 11 } 12 13 public class Sample : ISample 14 { 15 // パラメータが必要なコンストラクタ 16 public Sample(string str) 17 { 18 } 19 } 20 21 public interface ISample 22 { 23 } 24}
やりたいことのイメージ
以下、エラーになりますが、やりたいことのイメージです
Form1側でInjectionされた型にパラメータを渡し、インスタンス化を行っているイメージです。
Program
1[STAThread] 2private static void Main() 3{ 4 var serviceCollection = new ServiceCollection(); 5 serviceCollection.AddTransient<Form1>(); 6 // ここではinjectionされるクラスのみを指定 7 serviceCollection.AddTransient<ISample, Sample>(); 8 9 var provider = serviceCollection.BuildServiceProvider(); 10 11 Application.EnableVisualStyles(); 12 Application.SetCompatibleTextRenderingDefault(false); 13 Application.Run(provider.GetRequiredService<Form1>()); 14}
Form1
1using System.Windows.Forms; 2 3namespace WindowsFormsApp17 4{ 5 public partial class Form1 : Form 6 { 7 private readonly ISample _sample; 8 9 public Form1(ISample sample) 10 { 11 InitializeComponent(); 12 // なんらかの条件があり 13 if (xxx) 14 { 15 // ある場合は、パラメータ"abc"でインスタンス化 16 _sample = sample("abc"); 17 } 18 else 19 { 20 // ある場合は、パラメータ"efg"でインスタンス化 21 _sample = sample("efg"); 22 } 23 } 24 } 25 26 public class Sample : ISample 27 { 28 public Sample(string str) 29 { 30 } 31 } 32 33 public interface ISample 34 { 35 } 36}
よろしくおねがいします。
補足情報(FW/ツールのバージョンなど)
VisualStudio2017
.NetFramework4.7.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/07 12:37