質問: @fopen('php://stdin', 'r'); ``` これと等価な事をAsp.Net Core MVCでやる方法を教えて頂けないでしょうか。 よろしくお願いします。
回答: ASP.NET Coreアプリケーションのプロジェクト内には`Main`メソッド(通常`Program.cs`内)が定義されており、ここで下記のようにWebアプリケーションの構成と実行を行っています。 ``` public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup() .Build(); // hostの作成方法は一例です host.Run(); } } ``` 最後の`IWebHost.Run()`の呼び出しがWebアプリケーションの起動に当たりますので、コマンドライン引数`args`の値によって`Run()`以外の処理を行えば通常のコンソールアプリケーションとして動作します。 ``` if (args[0] == "controller" && args[1] == "action") { // 特別な処理 } else { host.Run(); } ``` 実行する処理については`host.Services.GetService(Type)`メソッドで標準のDependency Injectionを利用できます。引数の`Type`は実際のコントローラーでも良いのですが、HTTPに依存しない共通クラスの方が好ましいです。 ``` var hoge = (HogeService)host.GetService(typeof(HogeService)); hoge.ExecuteFuga(); // HogeControllerでもHogeServiceをコンストラクター引数に追加し、アクションで`ExecuteFuga`を使用すること。 ``` もし`args`の判定で任意のアクションを使用したいのであれば、`IActionDescriptorCollectionProvider`サービスからアクションの情報を検索することができます。ただ引数の問題もありますのでお勧めはしません。 なお上記の方法ではWebアプリと同一の構成を使用するために`host`を作成していますが、不要であれば直接`ServiceCollection`を`Configure`したり、あるいはDIを使用せずに直接インスタンスを作成するような実装でも問題ありません。 最後に標準入力ですが、`Console.In`(テキスト)や`Console.OpenStandardInput`(バイナリー)を使用すればよいです。