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

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

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

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

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

意見交換

クローズ

4回答

558閲覧

インスタンス生成をDIとController内どちらでやるべきか

locoJr.

総合スコア15

DI (Dependence Injection)

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

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

0グッド

0クリップ

投稿2023/06/17 02:56

編集2023/06/18 21:37

0

0

背景

現在、Web API でメール送信サービスを実装していますが、あまりWeb APIの開発に慣れていないため、『本来どうするべきなのか』という質問をしたいです。

前提

SMTPクライアントは.NET標準のSmtpClientを使用します。
Requestのbodyからメールの内容を取得します。
内容のチェックなどをし、問題があればエラーで終了、なければメール送信します。
なお、appsettings.jsonの内容は、オプションパターンを使用しController呼び出し時に取得しています。

お聞きしたいこと

①SmtpClientのインスタンス生成は、メソッド実行時にやるべきなのか、それとも「インスタンス生成やSendを実行できるクラス」を作成しAddScopeでDIすべきなのか、それとも他に良いやり方があるのか。
②DIするとした場合、インターフェースを介すようにした方が良いのか。
③送信内容のチェックや送信自体は、Controller内で直接するのか、それともDIしたクラスまたはインターフェースを実装したクラスで演るようにしたほうが良いのか。

補足情報(FW/ツールのバージョンなど)

ASP.NET Web API
.NET 6
VS2022

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

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

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

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

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

回答4

#1

退会済みユーザー

退会済みユーザー

総合スコア0

投稿2023/06/17 04:44

ASP.NET のタグも付けてください。

①SmtpClientのインスタンス生成は、メソッド実行時にやるべきなのか、それとも「インスタンス生成やSendを実行できるクラス」を作成しAddScopeでDIすべきなのか、それとも他に良いやり方があるのか。

適材適所だと思いますが・・・

Visual Studio 2022 のテンプレートを使って ASP.NET Core アプリのプロジェクトを生成すれば、DI 機能は ASP.NET Core のフレームワークに備わっていて容易に実装できるようになります。

なので、「Sendを実行できるクラス」は Controller に DI 機能を使って inject するのがお勧めです。

「インスタンス生成」は ASP.NET Core のフレームワークに備わっている DI 機能が、そのクラスのオブジェクトを inject する際に自動的にやってくれます。

②DIするとした場合、インターフェースを介すようにした方が良いのか。

リポジトリパターン(下図参照)を使って本番用と試験用を入れ替えたりする場合はインターフェースを使うのがお勧めです

イメージ説明

出展: ASP.NET MVC 実践プログラミング(秀和システム)

③送信内容のチェックや送信自体は、Controller内で直接するのか、それともDIしたクラスまたはインターフェースを実装したクラスで演るようにしたほうが良いのか。

「送信内容のチェック」というのがユーザー入力の検証ということであれば、ASP.NET Core に備わっている検証機能(モデルのプロパティに検証属性を付与する)を使うのがお勧めです。

その他送信するためのコードなどは、「関心の分離」とかを考えて DI を使おうとしているのであれば、「Sendを実行できるクラス」に実装した方が良いのでは?

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

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

#2

退会済みユーザー

退会済みユーザー

総合スコア0

投稿2023/06/18 03:59

質問者さん、上の#1 を読んでのあなたの意見は? 「意見交換」するためにこのスレッドを立てたのではないのですか?

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

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

#3

locoJr.

総合スコア15

投稿2023/06/18 21:37

@SurferOnWwwさん

ご回答ありがとうございます。
また、せっかく回答いただけたにも関わらず、ご連絡が遅くなり申し訳ありません。

①SmtpClientのインスタンス生成は、メソッド実行時にやるべきなのか、それとも「インスタンス生成やSendを実行できるクラス」を作成しAddScopeでDIすべきなのか、それとも他に良いやり方があるのか。

テンプレで使える機能を使用した方が一般的だと思いましたので、メソッド実行時ではなくDI 機能を使って内部的にインスタンス生成されるようにしようと思いました。

②DIするとした場合、インターフェースを介すようにした方が良いのか。

分かりやすい図まで添付していただき、ありがとうございます。
入れ替えてのテストもしたいと思っていましたので、今回はインターフェース経由にしたいと思いました。

③送信内容のチェックや送信自体は、Controller内で直接するのか、それともDIしたクラスまたはインターフェースを実装したクラスで演るようにしたほうが良いのか。

①同様に標準の機能であるのであれば、それで対応したいと思いました。
モデルのプロパティに検証属性を付与する方法について確認し、実装したいと思います。

その他送信するためのコードなどは、「関心の分離」とかを考えて DI を使おうとしているのであれば、「Sendを実行できるクラス」に実装した方が良いのでは?

そうしたいと思います。

他の方からの意見を募りたいと思い意見交換をカテゴリに設定しましたが、意図と違う用途だったのでしたら申し訳ありません。

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

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

#4

退会済みユーザー

退会済みユーザー

総合スコア0

投稿2023/06/19 00:14

編集2023/06/19 00:15

#3

他の方からの意見を募りたいと思い意見交換をカテゴリに設定しましたが、

今回のスレッドのような内容であれば、「意見交換」ではなく「Q&A」にしていただくようお願いします。

「あまりWeb APIの開発に慣れていない」とのことで、しかも ASP.NET Core アプリのことはほとんどご存じないようですので、「意見交換」というレベルになりません。「Q&A」が適切です。

他の方からの意見が欲しいとのことですが、それは「Q&A」でも、他の人に意見があれば、出てくるはずです。

「意見交換」でも、他の人に意見がなければ出て来ないのは、このスレッドのとおりです。

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

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

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問