ASP . NET Frameworkに戻る.NETフレームワーク1


イントロ


私のプライベートプログラミングでは、通常使用します.ネットコア.
しかし、私も使用します.私の仕事のネットフレームワーク.
少なくともASPを書きたい.NET MVCは同じです.NETコアと.NET Framework.
それで、私はASPをためします.NET Frameworkこの時.

環境

  • ビジュアルスタジオ2019コミュニティ
  • .NET Framework Ver .4.8 .
  • ベースプロジェクト


    私は空のテンプレートでプロジェクトを作成します.
    クラスファイルがないので、ルートページを開くことさえできません.

    ルーティング


    “routeconfig . cs”でルートを定義することができます.
    まず、「get . net mvc」をnugetで追加します.
  • ASP .NET MVC ver .5.2.7
  • と同じです.NETコア、私は“コンベンションベースのルーティング”と“属性ベースのルーティング”を使用することができます.
    私は2番目のものを使用しやすく感じたので、私はそれを選んだ.

    Routeconfigcs


    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace NetFrameworkSample
    {
        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                // Use Attribute-Based Routing
                routes.MapMvcAttributeRoutes();
            }
        }
    }
    

    使用する


    それが自動的に活性化されないので、私はグローバルアプリケーションクラス(ASAX)を作成して、RouteConfigを加えます.

    グローバル.アークス


    <%@ Application Codebehind="Global.asax.cs" Inherits="NetFrameworkSample.Global" Language="C#" %>
    

    グローバル.アサックス.cs


    using System;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace NetFrameworkSample
    {
        public class Global : System.Web.HttpApplication
        {
    
            protected void Application_Start(object sender, EventArgs e)
            {
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
            }
        }
    }
    
    “global . asax . cs”はデフォルトでは多くのメソッドを持っていますが、今回は“ApplicationCounter Start”を使用します.

    コントローラクラスを追加する


    今、私は“属性ベースのルーティング”を使用することができます.
    それで、私はコントローラクラスを加えて、「Hello World!」を示します.

    コントローラ。cs


    using System.Web.Mvc;
    
    namespace NetFrameworkSample.Controllers
    {
        public class ProductsController: Controller
        {
            public ProductsController()
            {
            }
            [Route("")]
            public string GetMessage()
            {
                return "Hello world!";
            }
        }
    }
    

    で始まる", "


    「ルート」属性では、[ルート(//)])のようなスラッシュで始めることができません.
    私は少し混乱しました、私がASPでどんな例外も得ないので.ネットコア.

    ディレクトリ名


    新しいルートを追加.

    コントローラ。cs


    ...
            [Route("Products")]
            public string GetProductsMessage()
            {
                return "Hello Products";
            }
        }
    }
    
    私は“localhost:59522/製品”と“こんにちは製品”を得ることができます.
    そして、「製品」ディレクトリと「iproductservice . cs」をそれに加えます.
    その後、「localhost : 59522/products」にアクセスし、例外を取得します.
    私は“routeconfig”を追加する前に同じです.
    というのは、ルートとして同じ名前という名前のディレクトリがあるのであれば.NET Framework検索ディレクトリのファイルを検索します.
    ディレクトリ名に注意しなければなりません.
    ( localhost : 59522/API/productsのようなルートを設定することもできます).

    log ( nlog )


    nlogでログを出力します.
  • NLog
  • GitHub - NLog/NLog.Web: NLog integration for ASP.NET & ASP.NET Core 1-3
  • Tutorial · NLog/NLog Wiki · GitHub
  • インストール

  • Nlogウェブバージョン.4.9.3
  • 構成


    ASPでNLOGを使用する.NET Frameworkでは、Webで構成を追加します.設定.

    ウェブ設定


    ...
      <system.webServer> 
        <modules runAllManagedModulesForAllRequests="true"> 
          <add name="NLog" type="NLog.Web.NLogHttpModule, NLog.Web" />
        </modules>
      </system.webServer>
    </configuration>
    
    そしてNLOGを加えます.と同じように設定します.

    Nlog設定


    <?xml version="1.0" encoding="utf-8" ?>
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          autoReload="true">
    
        <targets>
            <target xsi:type="Console" name="outputconsole"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
    
            <target xsi:type="File" name="outputfile" fileName="C:\tmp\logs\NetFrameworkSample\${date:format=yyyy}\${date:format=MM}\${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
        </targets>
    
        <rules>
            <logger name="*" minlevel="Debug" writeTo="outputconsole" />>
            <logger name="Microsoft.*" maxLevel="Info" final="true" />
            <logger name="*" minlevel="Debug" writeTo="outputfile" />
        </rules>
    </nlog>
    

    インスタンスの作成


    "logmanager . getCurrentClassLogger ()"でインスタンスを作成できます.

    コントローラ。cs


    using System.Web.Mvc;
    using NLog;
    
    namespace NetFrameworkSample.Controllers
    {
        public class ProductsController: Controller
        {
            private readonly Logger _logger;
            public ProductsController()
            {
                _logger = LogManager.GetCurrentClassLogger();
            }
            [Route("")]
            public string GetMessage()
            {
                _logger.Debug("Hello");
                return "Hello world!";
            }
    ...
    
    今ログ出力することができます以下のように.
    2020-09-02 21:05:58.0307||DEBUG|NetFrameworkSample.Controllers.ProductsController|Hello |url: http://localhost/|action: 
    

    DI (依存性注入)


    ASP .NET Frameworkには既定でDIがありません.
    今回はUnityコンテナを使います.
  • Welcome to Unity Container Documentation! | Unity Container
  • 私は"マイクロソフト. extension . dependencyInjection "を使うこともできました.
    将来的には、私はそれを試みるかもしれません.

    インストール

  • 統一.コンテナバージョン.5.11.8
  • 統一.MVCバージョン.5.11.1
  • 依存関係を登録する


    iProductsサービス。cs


    namespace NetFrameworkSample.Products
    {
        public interface IProductsService
        {
        }
    }
    

    プロダクションサービス。cs


    namespace NetFrameworkSample.Products
    {
        public class ProductsService: IProductsService
        {
        }
    }
    

    Unityconfig。cs


    using System;
    using Unity;
    using NetFrameworkSample.Products;
    
    namespace NetFrameworkSample
    {
        /// <summary>
        /// Specifies the Unity configuration for the main container.
        /// </summary>
        public static class UnityConfig
        {
            #region Unity Container
            private static Lazy<IUnityContainer> container =
              new Lazy<IUnityContainer>(() =>
              {
                  var container = new UnityContainer();
                  RegisterTypes(container);
    
                  container.RegisterType<IProductsService, ProductsService>(TypeLifetime.Scoped);
    
                  return container;
              });
    ...
    
  • Per Container Lifetime | Unity Container
  • 注入する


    Unityコンテナはコンストラクタ注入を使用します.

    コントローラ。cs


    using System.Web.Mvc;
    using NetFrameworkSample.Products;
    
    namespace NetFrameworkSample.Controllers
    {
        public class ProductsController: Controller
        {
            private readonly IProductsService _product;
            public ProductsController(IProductsService product)
            {
                _product = product;
            }
    ...
    

    インスタンス


    DBContextのようなインスタンスを指定したい場合は、“registerinstance”を使用できます.
    var sample = new ProductsService();
    container.RegisterInstance<IProductsService>(sample, InstanceLifetime.PerContainer);              
    
    nlogインスタンスを注入できますが.しかし、私はそれをすべきではありません.
    「logger」のクラス名の全てが「unityconfig」になるので.

    型(インスタンス)の寿命


    Unityコンテナには、「マイクロソフト. Extension . DependencyInjection」より多くのライフタイムコントロールがあります.
  • Lifetime Management | Unity Container
  • コンクリートクラスを注入する


    私は登録なしで具体的なクラスを注入することができます.
    しかし、彼らのインスタンスの寿命は一時的です.
    それで、私はDBContext(Scoped)のような他のライフタイムを設定すべきクラスを明示的に登録しなければなりません.