Web API 방법 .Net 코어 기본 사항에서 고급 Part3 데이터 액세스 계층으로

다시 오신 것을 환영합니다!

이제 여러분과 같은 똑똑한 사람들이 아래 이미지와 같이 혼란스러운 단일 계층 애플리케이션이 무엇인지 이미 알아냈다고 해도 놀라지 않을 것입니다.



위의 이미지를 보면 프레젠테이션 논리, 비즈니스 논리 및 데이터 액세스 문제가 하나의 단일 계층에 포함되어 있습니다. 소프트웨어에 대한 수요가 증가함에 따라 새로운 기능을 구축하기 위해 변경해야 한다고 상상해 보십시오. 이제 모든 변경 사항은 세 계층 모두에 영향을 미치기 때문에 주요 코드 변경이 필요합니다.

이러한 문제를 해결하기 위해 아래 이미지와 같이 "관심사 분리"를 사용합니다. 프레젠테이션 데이터(컨트롤러)를 비즈니스 계층(서비스 계층)과 데이터 계층(저장소)에서 분리하고 있습니다. 이를 통해 세 계층 모두를 쉽게 변경할 수 있습니다. 예를 들어 비즈니스 계층은 데이터 계층과 데이터 처리 방법에 대한 지식이 없으므로 관심사 분리를 도입하여 많은 유연성을 제공합니다. 당신이에 대해 더 읽고 싶다면



이제 비즈니스에 착수하여 데이터 액세스 계층을 구현하겠습니다. Repository라는 폴더를 만들고 폴더 안에 CompanyRepository.cs 클래스 파일을 추가해야 합니다. Repository 폴더 안에 또 다른 폴더를 만들고 이름을 Contract로 지정하겠습니다. 여기에서 인터페이스 클래스 파일을 추가하고 이름을 ICompanyRepository.cs surprise surprise :)로 지정하겠습니다. Repository Pattern.에 대해 더 알고 싶다면



이제 인터페이스에 코드를 추가하여 데이터 계층에서 원하는 메서드를 정의할 수 있습니다.

ICompanyRepository.cs

public interface ICompanyRepository
    {

        /// <summary>
        /// Return all companies including records marked as deleted and disabled
        /// </summary>
        /// <returns>Entites.Company</returns>
        Task<ICollection<Entities.Company>> GetAllCompaniesAsync();
        /// <summary>
        /// Return list of companies which are not marked as deleted.
        /// </summary>
        /// <returns>Entites.Company</returns>
        Task<ICollection<Entities.Company>> GetCompaniesAsync();
        /// <summary>
        /// Return list of companies which are marked as deleted
        /// </summary>
        /// <returns>Entites.Company</returns>
        Task<ICollection<Entities.Company>> GetDeletedCompaniesAsync();
        /// <summary>
        /// Return list of companies which are marked as disabled
        /// </summary>
        /// <returns>Entites.Company</returns>
        Task<ICollection<Entities.Company>> GetDisabledCompaniesAsync();
        /// <summary>
        /// Return a company record
        /// </summary>
        /// <param name="CompanyId"></param>
        /// <returns>Entites.Company</returns>
        Task<Entities.Company> GetCompanyByIDAsync(int CompanyId);
        /// <summary>
        /// Return a company record
        /// </summary>
        /// <param name="CompanyGUID"></param>
        /// <returns>Entites.Company</returns>
        Task<Entities.Company> GetCompanyByGUIDAsync(Guid CompanyGUID);
        /// <summary>
        /// Return True/False if record exist
        /// </summary>
        /// <param name="CompanyName"></param>
        /// <returns>bool</returns>
        Task<bool> CompanyExistAsync(string CompanyName);
        /// <summary>
        /// Return True/False if record exist
        /// </summary>
        /// <param name="Id"></param>
        /// <returns>bool</returns>
        Task<bool> CompanyExistAsync(int Id);
        /// <summary>
        /// Return bool if record exist
        /// </summary>
        /// <param name="CompanyGUID"></param>
        /// <returns>bool</returns>
        Task<bool> CompanyExistAsync(Guid CompanyGUID);
        /// <summary>
        /// Add a new record for company
        /// </summary>
        /// <param name="company"></param>
        /// <returns>bool</returns>
        Task<bool> CreateCompanyAsync(Entities.Company company);
        /// <summary>
        /// Update a record in db
        /// </summary>
        /// <param name="company"></param>
        /// <returns>bool</returns>
        Task<bool> UpdateCompanyAsync(Entities.Company company);
        /// <summary>
        /// Update a record as Deleted=True
        /// </summary>
        /// <param name="CompanyGUID"></param>
        /// <returns>bool</returns>
        Task<bool> SoftDeleteCompanyAsync(Guid CompanyGUID);
        /// <summary>
        /// Permanently remove a record from db
        /// </summary>
        /// <param name="company"></param>
        /// <returns></returns>
        Task<bool> HardDeleteCompanyAsync(Entities.Company company);

    } 



이는 데이터베이스 서버와 상호 작용하고 프레젠테이션과 비즈니스 로직을 분리하는 CompanyRepository.cs입니다.

public class CompanyRepository : ICompanyRepository
    {
        private readonly DataContext _dataContext;

        public CompanyRepository(DataContext dataContext)
        {
            this._dataContext = dataContext;
        }
        public async Task<bool> CompanyExistAsync(string CompanyName)
        {
            return await _dataContext.Companies.AnyAsync(Comp => Comp.CompanyName.Contains(CompanyName));
        }

        public async Task<bool> CompanyExistAsync(int Id)
        {
            return await _dataContext.Companies.AnyAsync(Comp => Comp.Id == Id);
        }

        public async Task<bool> CompanyExistAsync(Guid CompanyGUID)
        {
            return await _dataContext.Companies.AnyAsync(Comp => Comp.GUID == CompanyGUID);
        }

        public async Task<bool> CreateCompanyAsync(Company company)
        {
            await _dataContext.Companies.AddAsync(company);
            return await Save();
        }
        public async Task<bool> UpdateCompanyAsync(Company company)
        {
            _dataContext.Companies.Update(company);
            return await Save();
        }

        public async Task<ICollection<Company>> GetAllCompaniesAsync()
        {
            return await _dataContext.Companies.ToListAsync();
        }

        public async Task<ICollection<Company>> GetCompaniesAsync()
        {
            return await _dataContext.Companies.Where(Comp => Comp.IsDeleted == false).ToListAsync();
        }

        public async Task<Company> GetCompanyByGUIDAsync(Guid CompanyGUID)
        {
            return await _dataContext.Companies.FirstOrDefaultAsync(Comp => Comp.GUID == CompanyGUID);
        }

        public async Task<Company> GetCompanyByIDAsync(int CompanyId)
        {
            return await _dataContext.Companies.FirstOrDefaultAsync(Comp => Comp.Id == CompanyId);
        }

        public async Task<ICollection<Company>> GetDeletedCompaniesAsync()
        {
            return await _dataContext.Companies.Where(Comp => Comp.IsDeleted == true).ToListAsync();
        }

        public async Task<ICollection<Company>> GetDisabledCompaniesAsync()
        {
            return await _dataContext.Companies.Where(Comp => Comp.IsEnabled == false).ToListAsync();
        }

        public async Task<bool> HardDeleteCompanyAsync(Company company)
        {
            _dataContext.Remove(company);
            return await Save();
        }

        public async Task<bool> SoftDeleteCompanyAsync(Guid CompanyGUID)
        {
            var _exisitngCompany = await GetCompanyByGUIDAsync(CompanyGUID);

            if (_exisitngCompany != null)
            {
                _exisitngCompany.IsDeleted = true;
                return await Save();
            }
            return false;
        }

        private async Task<bool> Save()
        {
            return await _dataContext.SaveChangesAsync() >= 0 ? true : false;
        }

    }


그렇게 나쁘지 않았습니까?
다음에 만나요 :)

좋은 웹페이지 즐겨찾기