
★★★ 緊急告知 ★★★ Visual Studio Code,Docker,WSLを使ってWindows開発環境を改善するためのオンラインセミナーやります!Web+DB Press vol.117に寄稿した内容がベースで,イマドキのナウい開発環境を体感出来ます。 【2021/1/29(金) 19:00〜】WSL2、Visual Studio Code、DockerでグッとよくなるWindows開発環境 |
こんにちは、サイオステクノロジー技術部 武井です。前回に引き続き、今回はいろんなDIの方法を書きます。
その1
以前ご紹介した方法は、以下のようにジェネリックの第1引数にインターフェース、第2引数にその実装クラスを指定しました。
1 |
AddSingleton<[インターフェースの型],[インターフェースの実装クラスの型]>(); |
以下のような書き方も可能みたいです。
1 |
AddSingleton<[クラスの型]>(); |
上記のクラスは、別に何らかのインターフェースを実装している必要はなく、普通のクラスでOKです。この場合、[クラスの型]をnewしたインスタンスがDIコンテナに登録され、スコープはSingletonになります。この書き方を実践したソースコードのサンプルは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
public class Startup { public void ConfigureServices(IServiceCollection services) { // これはHelloWorldクラスのインスタンスをDIする記述です。 services.AddSingleton<HelloWorld>(); services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } } public class HelloWorld { public string Greet() { return "こんにちは世界"; } } public class HomeController : Controller { private HelloWorld _helloWorld; // HelloWorldクラスをコンストラクタインジェクションしています。 // 「その1」ではインターフェースを定義していましたが、 // 今回はAddSingletonメソッドでクラスしか定義してないので、 // クラスを指定しています。当然このhelloWorldにはHelloWorldクラスを // newしたインスタンスが入っています。 public HomeController(HelloWorld helloWorld) { this._helloWorld = helloWorld; } public IActionResult Index() { this.ViewBag.Greet = this._helloWorld.Greet(); return View(); } } |
ビュー(index.cshtml)は以下のとおりです。
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> @this.ViewBag.Greet </body> </html> |
実行結果は以下の通りとなります。
1 |
こんにちは世界 |
さくっと何かのクラスのインスタンスをDIしたいときにこういう記述が役に立つのだと思います。
その2
その1の記述は以下のように記載することも出来ます。
1 |
AddSingleton(Func<IServiceProvider, TService> implementationFactory) |
先程の「こんにちは世界」のソースコードにて、HelloWorldをDIする部分を上記の書き方で実現するためには、以下のようになります。
1 2 3 4 |
services.AddSingleton(sp => { return new HelloWorld(); }); |
もっと省略した書き方は以下のようになります。
1 |
services.AddSingleton(_ => new HelloWorld()); |
ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!

>> 雑誌等の執筆依頼を受付しております。
ご希望の方はお気軽にお問い合わせください!
コメント投稿