1) ORM을 끄려면 어떻게해야합니까? 저장소에 ORM 코드가 없으면 응용 프로그램에 특정 ORM 코드가 있어야합니다.
나는 회사가 갑자기 데이터 액세스 기술을 전환하기로 결정한 위치에 아직 없었다. 이런 일이 발생하면 약간의 작업이 필요합니다. 인터페이스를 통해 데이터 액세스 작업을 추상화하는 경향이 있습니다. 리포지토리는이를 해결하는 한 가지 방법입니다.
그런 다음 데이터 액세스 계층을 구체적으로 구현하기 위해 다른 어셈블리를 갖게됩니다. 예를 들어, 나는 가질 수 있습니다 :
Company.Product.Data
및 Company.Product.Data.EntityFramework
어셈블리. 다른 어셈블리가 Entity Framework의 데이터 액세스 논리를 구체적으로 구현하는 경우 첫 번째 어셈블리는 인터페이스 용으로 만 사용됩니다.
2) ORM을 사용하지 않고 데이터 액세스 및 오브젝트 데이터 채우기에 ADO.net을 사용하는 경우에도 저장소 패턴이 여전히 유효합니까?
어떤 패턴이 유효한지 결정하는 것은 당신에게 달려 있다고 생각합니다. 프레젠테이션 레이어에서 리포지토리 패턴을 사용했습니다. 명심해야 할 것은 사람들이 저장소에 책임을 던지는 것을 좋아한다는 것입니다. 알기 전에 리포지토리 수업은 춤, 노래 및 모든 종류의 일을합니다. 이것을 피하고 싶다.
GetAll, GetById, Update 및 Delete 책임을 가짐으로써 시작된 리포지토리 클래스를 보았습니다. 프로젝트가 완료 될 무렵, 같은 클래스에는 수십 가지의 방법 (책임)이 있었으며,이 방법은 없었습니다. 예를 들어 GetByForename, GetBySurname, UpdateWithExclusions 및 모든 종류의 미친 것들.
여기에서 쿼리와 명령이 작동합니다.
3) ORM을 사용하지만 저장소 패턴은 사용하지 않는 경우 일반적으로 사용되는 조회를 어디에 보관합니까? 각 쿼리를 클래스로 표현하고 인스턴스를 생성하는 일종의 쿼리 팩토리를 갖는 것이 현명합니까?
리포지토리 대신 쿼리와 명령을 사용하는 것이 좋습니다. 나는 다음을한다 :
쿼리에 대한 인터페이스를 정의하십시오. 이것은 단위 테스트에 도움이됩니다. 예 :public interface IGetProductsByCategoryQuery { ... }
쿼리에 대한 구체적인 구현을 정의하십시오. 선택한 IoC 프레임 워크를 통해 이들을 주입 할 수 있습니다. 예 :public class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
이제는 수십 가지 책임이있는 오염 저장소를 오염시키는 대신 쿼리를 네임 스페이스로 그룹화하기 만하면됩니다. 예를 들어, 위 쿼리에 대한 인터페이스는 다음에있을 수 Company.SolutionName.Products.Queries
있으며 구현은Company.SolutionName.Products.Queries.Implementation
데이터 업데이트 또는 제거와 관련하여 동일한 방식으로 명령 패턴을 사용합니다.
어떤 사람들은 프로젝트가 완료되기 전에 수십 개의 클래스와 네임 스페이스를 가질 것이라고 동의하지 않을 수도 있습니다. 네 그렇습니다. 내 마음에 그것은 당신이 선택한 IDE에서 솔루션을 탐색하고 특정 구성 요소가 어떤 종류의 책임을 즉시 볼 수 있기 때문에 좋은 것입니다. 리포지토리 패턴을 대신 사용하기로 결정한 경우 각 리포지토리 클래스를 살펴보고 해당 책임을 해결해야합니다.