리포지토리 패턴을 구현하기 위해 엔티티 클래스는 LINQ에서 SQL 공급자로 분리되었습니다. 어떻게?

StackOverflow https://stackoverflow.com/questions/229627

문제

나는 저장소 패턴을 살펴 보았고 과거에 사용했던 아이디어를 인식하여 기분이 좋았습니다.

그러나 이제이 패턴을 사용하는 응용 프로그램을 작성하고 싶습니다. 하지만 엔티티 클래스를 분리하고 싶습니다 저장소 제공 업체로부터.

나는 여러 어셈블리를 만들 것입니다 :

  1. Irepository 인터페이스를 포함하여 공통 인터페이스를 호스팅하는 "인터페이스"어셈블리
  2. 제품, 사용자, 주문 등과 같은 엔티티 클래스를 호스팅하는 "엔터티"어셈블리. 이 어셈블리는 "인터페이스"어셈블리에 의해 참조됩니다. 일부 방법은 그러한 유형 또는 배열을 반환하기 때문입니다. 또한 메인 애플리케이션 어셈블리 (예 : 웹 응용 프로그램)에 의해 참조됩니다.
  3. 하나 이상의 저장소 제공 업체 어셈블리/어셈블리. 각각에는 Irepository 인터페이스를 구현하는 클래스가 포함되며 특정 데이터 저장소에서 작동합니다. 데이터 저장소에는 SQL Server, Oracle Server, MySQL, XML 파일, 웹 / WCF 서비스 등이 포함될 수 있습니다.

생성 된 클래스와 CustomDataconText 클래스 간의 깊은 의존성을 발견 할 때까지 모든 것을 구현하는 데 걸리는 시간에 매우 생산적인 LINQ에서 SQL을 연구하는 것은 모든 것을 구현하는 데 매우 생산적입니다.

이러한 시나리오에서 LINQ에서 SQL을 사용하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

이것이 정확히 당신이 원하는지는 모르겠지만 Rob Conery의 MVC Storefront 코드를 살펴보고 싶을 수도 있습니다. 그는 LINQ 제공 업체와 함께 저장소 패턴의 변형을 사용합니다. 그는 LINQ에서 SQL 객체를 도메인 객체에 맵핑 한 다음 저장소 제공 업체의 도메인 객체를 서비스 계층으로 반환하여 제공자가 비즈니스 계층에 도달하기 전에 반환 된 데이터에 대한 논리를 작업 할 수 있도록 제공합니다.

MVC 매장 웹 캐스트
암호

나에게 그것은 당신이 제공자가 DTO를 반환하기를 원하는 것처럼 들린 다음 DTO를 리포지토리/서비스 계층의 도메인 개체에 매핑하려고합니다. 이 경우 LINQ에 SQL 제공 업체를 DTOS에 매핑 할 수 있고, 리포지토리/서비스 계층의 도메인 객체에 DTO를 매핑 할 수 있습니다. 이것은 잘 작동해야하지만 이제 2 개의 매핑 레이어가 있기 때문에 지루할 수 있습니다.

이 경우 : iproductository를 사용하는 ProductService. iprodupository의 방법을 불러 일으켜 DTO를 되 찾습니다. 그런 다음 DTO를 실제 비즈니스 객체에 매핑하여 호출 코드로 반환합니다.

다른 팁

데이터베이스를 모든 클래스에 매핑하는 외부 XML 파일을 만들 수 있습니다.

 <?xml version="1.0" encoding="utf-8"?>
 <Database Name="DbName" 
           xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
    <Table Name="DbTableName">
       <Type Name="EntityClassName" >
           <Column Name="ID" Type="System.Int64" Member="Id"
                   DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true"
                   CanBeNull="false" />
           <Column Name="ColumnName" Type="System.String" Member="PropertyA"
                   DbType="VarChar(1024)" CanBeNull="true" />
       </Type>
    </Table>
 </Database>

그런 다음 XML을 DataContext 클래스로 전달합니다.

 using (var cn = GetDbConnection())
  { var mappingSrc = XmlMappingSource.FromReader(xmlReader);

    using (var db = new DataContext(cn, mappingSrc))
     { var q = from entity in db.GetTable<EntityClassName>()
               where entity.PropertyA = "..."
               select entity.ID;
     }
  }

나는 이것에 대한 환상적인 블로그 게시물 (좋은 코드가 많이 있음)을 찾았습니다. http://iridescence.no/post/linqto-programming-against-interface-and-the-repository-pattern.aspx

나는 당신이 Poco (일반 Old CLR Objects) 지원을 원한다고 생각합니다. LINQ에서 SQL에는 어댑터가 호출됩니다 Close2poco.

그러나 나는 엔티티 프레임 워크로 전환하는 것이 좋습니다. 포코 어댑터, 그러나하지만 V2 상자 밖으로 지원 될 것으로 예상됩니다..

LINQ에서 SQL 생성 코드를 사용할 필요가 없으며 필요한 컬럼을 사용하여 자신의 클래스를 장식하거나 외부 XML 매핑 파일을 사용할 수 있습니다.

가장 간단한 방법은 Datacontext에서 엔터티를 분리하는 것입니다. 필요한 엔티티를로드하고, 데이터 콘텍스트에서 해체하고, 좋아하는 동안 사용하고 나중에 aitch ()를 사용하여 저장을 위해 Datacontext와 결합하십시오.

슬프게도 LINQ에는 데이터 콘텍스트에서 엔티티를 분리하는 방법이 없지만 복제 할 수 있습니다. 가장 간단한 방법은 다음과 같습니다.

public static T CloneEntity<T>(T source)
{
  DataContractSerializer dcs = new DataContractSerializer(typeof(T));
  using (Stream stream = new MemoryStream())
  {
    dcs.WriteObject(stream, source);
    stream.Seek(0, SeekOrigin.Begin);
    return (T)dcs.ReadObject(stream);
  }
}

나는 WCF와 비슷한 일을했다

1 DBML에서 직렬화 모드를 단방향으로 설정합니다.

2 테이블의 모든 열을 updateCheck = false로 설정합니다.

3 서비스와 같은 서비스 작성 :

   public class Service1 : IService1
    {
        public Company GetCompany(int companyId)
        {
            using (DataClasses1DataContext dc = new DataClasses1DataContext())
            {
                return (from c in dc.Companies where c.CompanyId == companyId select c).Single();
            }
        }

    public void SaveCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.Attach(company, true);
            dc.SubmitChanges();
        }
    }

    public void InsertCompany(Company company)
    {
        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            dc.Companies.InsertOnSubmit(company);
            dc.SubmitChanges();
        }
    }
}

4 서비스 참조를 추가하십시오

정확히 동일한 시나리오는 아니지만 XML 파일을 기반으로 OO 모델을 생성하는 사용자 정의 도구를 만들기 위해 노력하고 있습니다. 내 접근 방식은 장면 뒤에서 LINQ에서 SQL을 사용하는 것이며 코드를 자동으로 생성하므로 MySQL 데이터 소스라고 말하면 다른 메커니즘을 사용하기 쉽습니다. LINQ에서 SQL에서 지원되지 않으므로 데이터 액세스 코드를 수동으로 작성해야하지만 OO 모델을 사용하는 클라이언트 코드는 어떤 식 으로든 변경됩니다.

엔티티 클래스가 "인터페이스"어셈블리에서 선언 될 IPRODUCT, IUSER, IORDER 등을 구현할 수 있습니까? 이런 식으로 Irepository 인터페이스는 비즈니스 객체 인터페이스 (즉, iProduct 등의 컬렉션 등) 만 참조하고 "인터페이스"어셈블리는 다른 구현 별 어셈블리에서 분리됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top