Используйте DTO и AutoMapper в простом ASP. NET Core MVC с приложением EF Core - PullRequest
0 голосов
/ 18 января 2020

Я новичок в ASP. NET Core и построил ASP. NET Core MVC с приложением EF Core, используя подход Code First при создании базы данных.

Теперь я хочу использовать DTO и AutoMapper в этом простом приложении.

В приведенном ниже коде вы можете найти Employee.cs из папки Models:

public class Employee
    {
        [Key]
        public int EmployeeId { get; set; }
        [Column(TypeName ="nvarchar(250)")]
        [Required(ErrorMessage ="This field is required.")]
        [DisplayName("Full Name")]
        public string FullName { get; set; }
        [Column(TypeName = "varchar(10)")]
        [DisplayName("Emp. Code")]
        public string EmpCode { get; set; }
        [Column(TypeName = "varchar(100)")]
        public string Position { get; set; }
        [Column(TypeName = "varchar(100)")]
        [DisplayName("Office Location")]
        public string OfficeLocation { get; set; }
    }

Ниже вы можете найти файл EmployeeController.cs :

public class EmployeeController : Controller
    {
        private readonly EmployeeContext _context;

        public EmployeeController(EmployeeContext context)
        {
            _context = context;
        }

        // GET: Employee
        public async Task<IActionResult> Index()
        {
            return View(await _context.Employees.ToListAsync());
        }


        // GET: Employee/Create
        public IActionResult AddOrEdit(int id = 0)
        {
            if (id == 0)
                return View(new Employee());
            else
                return View(_context.Employees.Find(id));
        }

        // POST: Employee/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> AddOrEdit([Bind("EmployeeId,FullName,EmpCode,Position,OfficeLocation")] Employee employee)
        {
            if (ModelState.IsValid)
            {
                if (employee.EmployeeId == 0)
                    _context.Add(employee);
                else
                    _context.Update(employee);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(employee);
        }


        // GET: Employee/Delete/5
        public async Task<IActionResult> Delete(int? id)
        {
            var employee =await _context.Employees.FindAsync(id);
            _context.Employees.Remove(employee);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
    }

Кроме того, вы можете найти файл Startup.cs :

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });


            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            services.AddDbContext<EmployeeContext>(options => 
            options.UseSqlServer(Configuration.GetConnectionString("DevConnection")));
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Employee}/{action=Index}/{id?}");
            });
        }
    }

Какие изменения я должен внести в свое приложение, чтобы использовать DTO и AutoMapper?

Пожалуйста, дайте мне знать, нужны ли вам другие файлы из приложения.

Спасибо.

1 Ответ

0 голосов
/ 18 января 2020

Вы можете выполнить следующие шаги.

  1. Создать свой EmployeeDTO.cs
public class EmployeeDTO
{
    public int EmployeeId { get; set; }
    public string FullName { get; set; }
    public string EmpCode { get; set; }
    public string Position { get; set; }
    public string OfficeLocation { get; set; }
}
Установите соответствующий пакет NuGet

Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection

Примечание. Если мы установим пакет AutoMapper.Extensions.Microsoft.DependencyInjection, он автоматически установит для нас пакет AutoMapper. поскольку он ссылается на него.

Создать MappingProfile.cs

Добавить using AutoMapper;

public class MappingProfile : Profile
{
    public MappingProfile()
    {
          CreateMap<Employee, EmployeeDTO>();
          CreateMap<EmployeeDTO, Employee>();
    }
}
Настройка служб. Давайте сделаем это в классе Startup.cs.
services.AddAutoMapper(typeof(Startup));
Сначала мы вводим объект mapper в контроллер. Затем мы вызываем метод Map (), который сопоставляет объект Employee с объектом EmployeeDTO.
public class EmployeeController : Controller
{
     private readonly EmployeeContext _context;
     private readonly IMapper _mapper;

     public EmployeeController(EmployeeContext context,, IMapper mapper)
     {
         _context = context;
         _mapper = mapper;
     }

     // GET: Employee
     public async Task<IActionResult> Index()
     {

        List<EmployeeDTO> employees = _mapper.Map<List<Employee>, List<EmployeeDTO>>(await _context.Employees.ToListAsync());
        return View(employees);
     }
}
...