5

私のプロジェクトでは、サービス レイヤーを使用してリポジトリ パターンに従っています。ビューごとにビューモデルを作成します。

私が混乱しているのは、サービスレイヤーがドメインオブジェクトに直接アクセスしてそれらをコントローラーに返す必要があるか、それとも DTO を使用する必要があるかということです。DTO を使用する必要がある場合、プロジェクト アーキテクチャのどこに配置すればよいですか?

ありがとうございました。

4

1 に答える 1

9

サービス層は、適切なビジネス ロジックを実装することにより、Dto オブジェクトとドメイン オブジェクトのマッピング (変換) を担当します。

DTO オブジェクトはコントローラーとサービスで使用する必要があります。

DTO はコントローラーとサービスの間で転送されますが、ドメイン オブジェクトはサービスとリポジトリの間で転送されます。

コントローラはドメインを認識せず、リポジトリは DTO を認識しません。サービスは DTO とドメインの両方を認識し、ドライバーと道路の間の車のようなビジネス ルール、あなたと私の間のスタック オーバーフローのようなビジネス ルール、すべてのような抽象化でそれらを相互に変換します...

次のコードは例です。各名前空間はパッケージであると考えてください。

namespace Controllers
{
    using Services;
    using DataTransferObjects;

    public class CoffeeController
    {
        public ICoffeeService CoffeeService { get; set; }

        public JsonResult GetCoffee(GetCoffeeInDto inDto)
        {
            var result = CoffeeService.GetCoffee(inDto);
            return JsonResult(result);
        }

        public JsonResult SaveCoffee(SaveCoffeeInDto inDto)
        {
            var outDto = CoffeeService.SaveCoffee(inDto);
            return JsonResult(outDto);
        }
    }
}

namespace Services
{
    using DataTransferObjects;
    public interface ICoffeeService
    {
        GetCoffeeOutDto GetCoffee(GetCoffeeInDto inDto);
        SaveCoffeeOutDto SaveCoffee(SaveCoffeeInDto inDto);
    }
}

namespace Services.Impl
{
    using Services;
    using Repository;
    using DataTransferObjects;
    using Domain;

    public class CoffeeService : ICoffeeService
    {
        public ICoffeeRepository CoffeeRepository { get; set; }
        public GetCoffeeOutDto GetCoffee(GetCoffeeInDto inDto)
        {
            var entity = CoffeeRepository.Get(inDto.Id);
            return new GetCoffeeOutDto {Id = entity.Id, Name = entity.Name};
        }

        public SaveCoffeeOutDto SaveCoffee(SaveCoffeeInDto inDto)
        {
            var entity = new CoffeeEntity {Name = inDto.Name};
            CoffeeRepository.Save(entity);
            return new SaveCoffeeOutDto {Id = entity.Id};
        }
    }
}

namespace Repository
{
    using Domain;
    public interface ICoffeeRepository
    {
        CoffeeEntity Get(int id);
        void Save(CoffeeEntity coffeeEntity);
    }
}

namespace Repository.Impl
{
    using Repository;
    using Domain;

    public class CoffeeRepository:ICoffeeRepository
    {
        public CoffeeEntity Get(int id)
        {
            //get entity from db
            throw new System.NotImplementedException();
        }

        public void Save(CoffeeEntity coffeeEntity)
        {
            //insert entity into db
            throw new System.NotImplementedException();
        }
    }
}

namespace DataTransferObjects
{
    public class SaveCoffeeInDto
    {
        public string Name { get; set; }
    }

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

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

    public class GetCoffeeOutDto
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

namespace Domain
{
    public class CoffeeEntity
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}
于 2013-11-01T23:16:24.387 に答える