abp(net core)+easyui+efcore實現倉儲管理系統——ABP升級7.3下(五十九)

DotNet菜園發表於2023-04-01

Abp(net core)+easyui+efcore實現倉儲管理系統目錄

 

      承接上文abp(net core)+easyui+efcore實現倉儲管理系統——ABP升級7.3上(五十八)  繼續來講講升級過程中碰到的問題。

第四個問題

        升級過程中碰到的第四個問題:Value cannot be null. (Parameter 'unitOfWork')

        在Visual Studio 2022 的解決方案資源管理器中,找到ABP.TPLMS.Application專案中的Modules資料夾中的ModuleAppService.cs檔案,是這個檔案中的GetAll()方法報了這個錯誤。錯誤資訊如下圖。具體程式碼如下。   

   public List<Module> GetAll()
        {

            var modules= _moduleRepository.GetAllListAsync();
             return modules.Result;
    }

          在“使用者未處理的異常”資訊彈出框中,使用滑鼠左鍵點選“檢視詳細資訊”,會彈出“快速監視”彈出框,如下圖。我們看到具體的錯誤資訊是Value cannot be null. (Parameter 'unitOfWork')

 

 

         經過一番的資料蒐集,最後在官網的文件(https://aspnetboilerplate.com/Pages/Documents/Unit-Of-Work#non-transactional-unit-of-work)中找到以下這段,說明了這個錯誤。解決方案也在文件中。

          By its nature, a unit of work is transactional. ASP.NET Boilerplate starts, commits or rolls back an explicit database-level transaction. In some special cases, the transaction may cause problems since it may lock some rows or tables in the database. In these situations, you may want to disable the database-level transaction. The UnitOfWork attribute can get a boolean value in its constructor to work as non-transactional. Example usage:

 

 

 

          在Visual Studio 2022 的解決方案資源管理器中,找到ABP.TPLMS.Application專案中的Modules資料夾中的ModuleAppService.cs檔案,是這個檔案中的GetAll()上方新增禁用UnitOfWork事務的特性。具體程式碼如下: 

[UnitOfWork(isTransactional:false)]
        public List<Module> GetAll()
        {

            var modules = _moduleRepository.GetAllListAsync();
            return modules.Result;
        }

第五個問題

          升級過程中碰到的第五個問題:Can't create component 'ABP.TPLMS.Modules.ModuleAppService' as it has dependencies to be satisfied.Service 'AutoMapper.IMapper' which was not registered.

       在Visual Studio 2022 的解決方案資源管理器中,按F5執行,Visual Studio 2022又丟擲一個新的錯誤。這個問題實際上是之前的第三個問題的後續,由於第三個問題沒有解決好,才引發了這個問題。錯誤資訊如下圖。

 

public class ModuleAppService : ApplicationService, IModuleAppService
    {

        private readonly IRepository<Module> _moduleRepository;
        AutoMapper.IMapper m_map; 

        public ModuleAppService(IRepository<Module> moduleRepository, IMapper map)

        {
            _moduleRepository = moduleRepository;
            m_map = map;
        }
}

          在“使用者未處理的異常”資訊彈出框中,使用滑鼠左鍵點選“檢視詳細資訊”,會彈出“快速監視”彈出框,如下圖。我們看到具體的錯誤資訊是:

 

       具體的錯誤資訊如下:

      Can't create component 'ABP.TPLMS.Modules.ModuleAppService' as it has dependencies to be satisfied.
 'ABP.TPLMS.Modules.ModuleAppService' is waiting for the following dependencies:
- Service 'AutoMapper.IMapper' which was not registered.

        這個錯誤,說明我們的注入方式錯誤,AutoMapper沒有註冊,但是我們這是ABP,不是單獨使用AutoMapper,需要單獨註冊,有人會去從nuget上安裝automapper包,然後進行註冊。我認為,應該有一種方式能解決這個問題。我找到的方法是使用ObjectMapper.Map方法,具體程式碼如下。

using Abp.Application.Services;
using Abp.Application.Services.Dto;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using ABP.TPLMS.Entitys;
using ABP.TPLMS.Modules.Dto;
using AutoMapper;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Common;
using System.Reflection.PortableExecutable;
using System.Text;
using System.Threading.Tasks;
 
 
namespace ABP.TPLMS.Modules
{
    public class ModuleAppService : ApplicationService, IModuleAppService
    {
        private readonly IRepository<Module> _moduleRepository;
      // AutoMapper.IMapper m_map;
 
        public ModuleAppService(IRepository<Module> moduleRepository)
        {
            _moduleRepository = moduleRepository;       
           // m_map =map;
        }
        public Task CreateAsync(CreateUpdateModuleDto input)
        {
           var module= ObjectMapper.Map<Module>(input);
           // var module = Mapper.Map<Module>(input);
 
            return _moduleRepository.InsertAsync(module);
        }
        public Task UpdateAsync(CreateUpdateModuleDto input)
        {
            Logger.Info("更新操作-日記記錄 - 模組型別的名稱 為:" + input.DisplayName);
            var module = ObjectMapper.Map<Module>(input);
           // var module = m_map.Map<Module>(input);
            return _moduleRepository.UpdateAsync(module);
        }
        public async Task<ListResultDto<ModuleDto>> GetAllAsync()
        {
            var modules = await _moduleRepository.GetAllListAsync();
            return new ListResultDto<ModuleDto>(ObjectMapper.Map<List<ModuleDto>>(modules));
           
        }

        [UnitOfWork(isTransactional:false)]
        public List<Module> GetAll()
        {
            var modules = _moduleRepository.GetAllListAsync();
           return modules.Result;

        }

        public async Task DeleteAsync(int Id)
        {
             await _moduleRepository.DeleteAsync(Id);
         }

        public  void Delete(int Id)
        {
             _moduleRepository.Delete(Id);
        }

    }
}

 

       在修改完了程式碼之後,在Visual Studio 2022中按F5執行,終於看到了登入介面,在登入介面中的使用者名稱中輸入admin,在密碼輸入框中輸入123qwe這個預設密碼。瀏覽器自動跳轉到了首頁面。如下圖。

 

 

 

 

第六個問題:

        升級過程中碰到的第六個問題:Missing type map configuration or unsupported mapping.

       在瀏覽器的左邊的選單欄中有一個Business選單,使用滑鼠左鍵點選,展開。在展開的選單欄,使用滑鼠左鍵點選“模組管理”,Visual Studio 2022將會彈出一個錯誤。如下圖。

 

        在“使用者未處理的異常”資訊彈出框中,使用滑鼠左鍵點選“檢視詳細資訊”,會彈出“快速監視”彈出框,如下圖。我們看到具體的錯誤資訊是:

Missing type map configuration or unsupported mapping.
      Mapping types:
      Object -> CreateUpdateModuleDto
       System.Object -> ABP.TPLMS.Modules.Dto.CreateUpdateModuleDto

 

       這個錯誤是由於我們沒有定義autoMapper需要的配置資訊。

 

  1. 在Visual Studio 2022的“解決方案資源管理器”中,左鍵單擊“ABP.TPLMS.Application”專案,進行展開,找到“Modules\Dto”資料夾。

   2.右鍵單擊“Dto”資料夾,然後選擇“新增” > “類”。 將類命名為 ModuleMapProfile,然後選擇“新增”。程式碼如下。

using ABP.TPLMS.Authorization.Users;
using ABP.TPLMS.Entitys;
using ABP.TPLMS.Users.Dto;
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ABP.TPLMS.Modules.Dto
{
    public class ModuleMapProfile:Profile
    {
        public ModuleMapProfile()
        {

            CreateMap<ModuleDto, Module>();           
            CreateMap<ModuleDto, CreateUpdateModuleDto>();
           CreateMap<CreateUpdateModuleDto, Module>();
        }
    }
}

       3.在新增完ModuleMapProfile類的程式碼之後,在Visual Studio 2022中按F5執行,在登入介面中的使用者名稱中輸入admin,在密碼輸入框中輸入123qwe這個預設密碼。瀏覽器自動跳轉到了首頁面。

       4.在瀏覽器的左邊的選單欄中有一個Business選單,使用滑鼠左鍵點選,展開。在展開的選單欄,使用滑鼠左鍵點選“模組管理”,然後我們看到了模組管理的頁面,如下圖。

 

      至此專案中的一些問題解決了,ABP.TPLMS能初步執行了,專案也初步升級到了ABP 7.3,不過,這只是第一步,在後續測試中,應該還會有一些問題。

 

相關文章