이 연관 시나리오를 custom orm에서 구현하는 우아한 방법인가요?

dapper data-access-layer oop orm

문제

Dapper를 사용하여 사용자 지정 ORM을 작성합니다. 다음 표가 있습니다.

  • 사용자
  • 역할
  • 허가
  • RolePermission

내 sproc 2 선택 : 기본 사용자 정보 1, 사용자 역할 정보 1. 기본 사용자 정보는 deserialize되어 사용자 객체로 변환됩니다. RolePermission 정보는 사용자 정의 RolePermission 객체로 deserialize 된 다음 사용자 객체에 프로그래밍 방식으로 연결됩니다. 사용자 정의 ORM에서 객체 그래프 구현을 얼마나 복잡하게 만드십니까? 예를 들어, EF는 User.UserRoles.Role.Name과 같은 역할 이름을 얻기 위해 쉽고 간단한 OO 접근 방식을 취합니다. 그러나 이것은 db fk 연관을 기반으로 엔티티 조인을 자동으로 매핑하는 복잡하고 정교한 f / w를 사용하여 수행됩니다. 또한 성능 오버 헤드가 있습니다. 내 생각 엔 다음과 같이 엔터티 클래스를 만드는 것입니다.

  • MyCompany.Entities.Entity.User.User
  • MyCompany.Entities.Entity.User.RolePermission

따라서 내 RolePermission 객체는 외부 종속성없이 User 엔터티에 맞게 조정됩니다. 이렇게하면 RolePermission 객체가 User 객체의 컨텍스트에서 가능한 한 가볍게 유지됩니다. 다른 엔티티 / 도메인 / 용도를 지원하기 위해 추가 속성이 필요하지 않습니다. 이것은 우아한 (쉽고 효과적이며 효율적인) 솔루션처럼 보입니다. 커스텀 ORM에서 복잡한 객체를 생성하는 이런 유형의 접근법에 대한 귀하의 생각은 어떻습니까?

인기 답변

나는 항상 이런 종류의 일을하며 정말 쉽습니다. 당신은 두 가지 질문을 할 것입니다. 두 개의 쿼리는 동일한 sproc에있을 수 있고 다른 결과 집합을 반환하거나 데이터베이스에 대한 두 개의 개별 호출 일 수 있습니다. 일반적으로 후자는 mssql을 사용하여 여러 결과 집합을 반환하지만 사용합니다.

우선 먼저 사용자 (얕은)와 역할 정보 (심층)를 포함하는 사용자의 세부 정보를 쿼리합니다.

public IEnumerable<User> GetUsers(int? userID, bool withDetails)
        {
            var users = db.Query<User>(@"   select * 
                                            from dbo.Users u 
                                            where (@userID IS NULL OR u.Id = @userID)", new { userID });

            if (withDetails)
            {
                var rolePermissions = db.Query<RolePermission>(@"   select * 
                                                                    from dbo.RolePermissions rp 
                                                                    where rp.UserId IN (select val from dbo.udf_ConvertIntListToTable(@userId_list))", new { userId_list = String.Join(',', users.Select(s => s.UserId)) });
                foreach(var user in users)
                {
                    user.RolePermissions = rolePermissions.Where(w => w.UserId == user.UserId);
                }
            }
        }

몇 가지 메모 :

  • dbo.udf_ConvertIntListToTable은 매우 잘 설정되어 있으며 훌륭하게 수행됩니다. 웹을 검색하면 찾으실 수 있습니다. 당신이 그것을 찾을 수 없다면 나는 그것을 요점으로로드 할 것입니다.
  • RolePermission에는 외부 사용자 (UserId 사용)에 대한 참조가 있어야합니다. 또한 해당 쿼리는 언급 한 추가 데이터 (예 : 역할, 권한 등)를 매핑합니다.
  • 위의 내용을 정리할 수있는 확장자가 있습니다. 가능한 한 생가죽으로 보관 했으므로 진행 상황을 볼 수 있습니다.
  • 이제는 목록 등의 매우 가벼운 쿼리 (withDetails = false)와 모든 데이터가 집계 된 루트 (User)로 잘 정리 된 무거운 쿼리가 생겼습니다.


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow