接口中定義異步的方法


我定義了如下接口引出錯誤:

 public interface INewsCategoryRepository    {
        void CreateNewsCategory(NewsCategory newsCategory);
    }

然后用如下類實現了上述接口

public async void CreateNewsCategory(NewsCategory newsCategory)
{
var db = dbContext as NewsEFCoreContext; await db.Categories.AddAsync(newsCategory); }

 

於是問題出現了:

public class AddNewsCategoryUseCase
    {
        private readonly IRepository repository;
        private readonly INewsCategoryRepository newsCategoryRepository;
        public AddNewsCategoryUseCase(IRepository argRepository, INewsCategoryRepository argNewsCategoryRepository)
        {
            this.repository = argRepository;
            this.newsCategoryRepository = argNewsCategoryRepository;
        }
        /// <summary>
        /// 添加新的新聞
        /// </summary>
        /// <param name="addNewsCategoryDto"></param>
        public  async void AddNewsCategory(AddNewsCategoryDto addNewsCategoryDto)
        {
            NewsCategory newsCategory = addNewsCategoryDto.ToNewsCategory();
            try
            {
                using (repository)
                {
                    //newsCategoryRepository 是接口成員 其返回類型是void 沒辦法使用await--------------------------!!!
                    await newsCategoryRepository.CreateNewsCategory(newsCategory);
                    repository.Commit();
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
            

        }
    }

截圖如下:

正確的辦法應該是:不能將接口方法定義為void 而應該定義為Task。(沒有返回值就用Task,有返回值就用Task<T>)

public interface INewsCategoryRepository
    {
        Task CreateNewsCategory(NewsCategory newsCategory);
    }

實現類如下:

public async Task CreateNewsCategory(NewsCategory newsCategory)
        {
            var db = dbContext as NewsEFCoreContext;
            await db.Categories.AddAsync(newsCategory);
        }

調用這個方法如下:

 public class AddNewsCategoryUseCase
    {
        private readonly IRepository repository;
        private readonly INewsCategoryRepository newsCategoryRepository;
        public AddNewsCategoryUseCase(IRepository argRepository, INewsCategoryRepository argNewsCategoryRepository)
        {
            this.repository = argRepository;
            this.newsCategoryRepository = argNewsCategoryRepository;
        }
        /// <summary>
        /// 添加新的新聞
        /// </summary>
        /// <param name="addNewsCategoryDto"></param>
        public  async Task AddNewsCategory(AddNewsCategoryDto addNewsCategoryDto)
        {
            NewsCategory newsCategory = addNewsCategoryDto.ToNewsCategory();
            try
            {
                using (repository)
                {
                    //沒問題------------------!!!
                    await newsCategoryRepository.CreateNewsCategory(newsCategory);
                    repository.Commit();
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
            

        }
    }

截圖:

 參考文章:異步編程中的最佳做法 https://msdn.microsoft.com/zh-cn/magazine/jj991977.aspx?f=255&MSPPError=-2147217396


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM