どのようにVisual Studio 2019を使用してMVC


私のポストが好きでしたか?
こんにちは、devs !
今日、私たちは私たちのASPにautofacとautomapperを統合されます.Visual Studio 2019を使用したNET MVC 5プロジェクト.
しかし、まず、これらのフレームワークは何かを教えてください.
Autofacは-ほとんどのフレームワークは、IOCやコントロールの反転に使用されます.このシステム設計は、依存性注入とも呼ばれる.DIは、ゆるく結合された、テスト可能で、維持可能なアプリケーションを構築することができます.これは、ソフトウェアコンポーネント間の依存関係を減らし、また、機能のほとんどを再利用可能にします.あなたがDIでより学びたいならば、私は非常に依存インジェクションを推薦します.マークシーマンによるネット.DIのすべてのタイプが異なっている本で議論されました.ネットソリューションが含まれています.
automapper -単に別のオブジェクトを類似のオブジェクトに変換するライブラリです.私が共有できる1つの主要な例は、モデルクラスをアプリケーションで使用する別のViewModelクラスに変換することです.通常、主クラスを変更する必要がない追加のプロパティを追加したり、その他の類似した要件を追加するために、必要とされないプロパティを隠します.
では、これらの両方を実装し始めましょう.AutoFacを使用してautomapperをコントローラに注入する必要があります!
まず、ASPを作成しましょう.Visual Studio 2019を使用したNet MVC 5プロジェクト.

オートファクト5



オートマッパー10



次にautofileから新しいモジュールを追加しましょう.ここでは、autofacアセンブリのモジュールクラスから継承する新しいクラスを追加します.
using Autofac;
using AutoMapper;

public class AutoFacModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.Register(context => new MapperConfiguration(cfg =>
            {
                //Register Mapper Profile
                cfg.AddProfile<AutoMapperProfile>();
            }
            )).AsSelf().SingleInstance();

            builder.Register(c =>
            {
                //This resolves a new context that can be used later.
                var context = c.Resolve<IComponentContext>();
                var config = context.Resolve<MapperConfiguration>();
                return config.CreateMapper(context.Resolve);
            })
            .As<IMapper>()
            .InstancePerLifetimeScope();
        }
    }
次にautomapperのプロファイルから継承するAutoMapPerprofileを追加します.( Person , PersonViewModelの定義はしばらく議論します)
using AutoFacAndAutoMapperMVC.Models;
using AutoMapper;

namespace AutoFacAndAutoMapperMVC.Infrastructure
{
    public class AutoMapperProfile : Profile
    {
        public AutoMapperProfile()
        {
            CreateMap<Person, PersonViewModel>();

            CreateMap<PersonViewModel, Person>();
        }
    }
}

自動マッパーの登録


これらの設定の後、グローバルにそれらの設定を登録する必要があります.MVCソリューションのASAXファイル
protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            var builder = new ContainerBuilder();

            // Register your MVC controllers. (MvcApplication is the name of
            // the class in Global.asax.)
            builder.RegisterControllers(typeof(MvcApplication).Assembly);

            //Register AutoMapper here using AutoFacModule class (Both methods works)
            //builder.RegisterModule(new AutoMapperModule());
            builder.RegisterModule<AutoFacModule>();

            // Set the dependency resolver to be Autofac.
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
次に、PersonとPersonViewModelクラスであるデモの2つのクラスを作成する必要があります.以下に2つのクラスの定義を示します:

public class PersonViewModel
    {
        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string Country { get; set; }

        public string MaritalStatus { get; set; }

        public string HighestEducation { get; set; }
    }

public class Person
    {
        public int Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public DateTime? DateOfBirth { get; set; }

        public string PhoneNumber { get; set; }

        public string Address { get; set; }

        public string City { get; set; }

        public string State { get; set; }

        public string Country { get; set; }

        public string MaritalStatus { get; set; }

        public string HighestEducation { get; set; }

    }
ではここでautomapperの目的は何ですか?データベースリポジトリやメモリ内のデータから結果セットから人のリストを取得しているとしましょう.そして、私たちはそれらの結果をプロジェクトに送りたいです、しかし、異なったモデルで、しかし、同じ特性で?いくつかのプロパティを非表示にするので、これを実行します.プロジェクションでこれを行うことができます.

//new List<Person>() only assumes that this results came from a results set of Person objects
var model = new List<Person>().Select(x => new PersonViewModel()
            {
                FirstName = x.FirstName,
                LastName = x.LastName,
                Country = x.Country,
                HighestEducation = x.HighestEducation,
                MaritalStatus = x.MaritalStatus
            });
各プロパティのマッピングは簡単ですが、実装ごとに行うすべてのプロジェクションのプロパティの長いリストが表示されるまではかなり生産的ではありません.
automapperでは、1つのコードだけでこれを行うことができます.

//This entity object can come from Database or any related source
            var person = new Person()
            {
                Id = 1,
                FirstName = "Cecilia",
                LastName = "Chapman",
                Address = "32 West Court Street",
                City = "Dallas",
                State = "GA",
                Country = "USA",
                DateOfBirth = new DateTime(1981, 1, 5),
                HighestEducation = "College Graduate",
                MaritalStatus = "Married",
                PhoneNumber = "+1-541-754-3010"
            };

          var model = _mapper.Map<PersonViewModel>(person);
それは簡単に、簡単にプロジェクションの長いリストを行うことなく、同じプロパティで2つのクラスをマップすることができます.
デバッグモード中の実際のマッピングのスクリーンショットを示します.

最後に、依存関係インジェクションを使用するには、コントローラのコンストラクターにImapperインターフェイスを直接注入します.リクエストが終了するまで、homecontrollerのすべての要求がImapperの新しいインスタンスを注入するように.
ここで私のGithubリポジトリで簡単な最終的な解決策を見てください.