1

Linq to SQL, C#.Linq To SQL - DAL 레이어를 DLL로 노출시키지 않고 응용 프로그램 계층을 동적으로 검색합니다.

나는 3 개의 층이있다 : DAL, BL, 신청. 각 테이블에 대해 BL의 검색 기능을 구축하여 해당 함수가 응용 프로그램 계층에서 'where'매개 변수로 가져 오도록하려고합니다. 이 접근법의 장점은 각 테이블에 대해 하나의 함수이므로 클라이언트는 5 가지 방법을 제공하는 자유롭고 동적 인 방법으로 검색 할 수 있습니다. 그의 수색을 제한한다.

내 응용 프로그램 계층에 내 DAL 계층의 DLL을 제공해야합니다. 그렇게하는 것은 문제를 해결하기위한 좋은 접근 방법이 아닙니다. 사용자가 검색 기능을 구축하여 동적으로 검색을 제한하도록 유도하는 것입니다. 응용 프로그램 계층에 내 DAL 계층에 대한 DLL이있는 경우 응용 프로그램 계층에서 ContextObject를 선언하고 내 데이터베이스에 잘못된 작업을 수행 할 수 있습니다.

이 문제를 해결하려면 어떻게해야합니까?

감사합니다. Stav Alfi.

업데이트 1 : 아시다시피

의 Linq는 각 테이블에 클래스를 구축 SQL로. 응용 프로그램 계층에서 Sql 클래스에 Linq를 사용할 수 없으므로 응용 프로그램 계층에 DAL DLL을 노출하고 싶지 않습니다. 내가 찾은 해결책은 Linq와 Sql 클래스를 동일하게 보이도록 클래스를 생성하는 것이므로 응용 프로그램 계층에서 사용할 수 있습니다. BL 계층은 이러한 클래스를 생성하기위한 resposnibol입니다. 응용 프로그램 계층에서 Linq를 SQL 클래스로 사용하지 않기 때문에 응용 프로그램 계층에 IQueryable (BL 계층의 모든 함수 결과는 응용 프로그램 계층의 클래스로 변환 됨)을 제공 할 수 없습니다.

업데이트 2 :

는 SQL에 Linq에이 LinqClientDB.designer.cs을 가지고 내가 응용 프로그램 계층에 DAL 층을 노출하는 경우가 해당 클래스

[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="ClientDB")] 
public partial class LinqClientDBDataContext : System.Data.Linq.DataContext 

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Clients")] 
public partial class Client : INotifyPropertyChanging, INotifyPropertyChanged 

을 구축, 응용 프로그램 층 LinqClientDBDataContext 클래스에 액세스 할 수 있습니다. 이것은 좋은 접근 방법이 아닙니다. 그래서 BL 계층에서 DAL.Client 클래스를 BL.Client 클래스로 변환하지만 클라이언트의 테이블에서 동적 검색을 할 수 없습니다. 내가 무엇을 할 수 있을지?

+0

이 LINQ-to-SQL 또는 Entity Framework가 있는지 확인하십시오. –

+0

DAL에 엔티티를 팔아서 길을 찾을 수 없으면 DAL에 엔티티를 배치하는 것은 재 패턴이 아닙니다. 그렇지 않다면 @ pswg의 대답은 –

+0

Linq to SQL을 사용하고 있습니다. Linq to SQL은 각 테이블에 적합한 클래스를 구축합니다. –

답변

1

BL을 통해 IQueryable<T>을 노출해도 DAL이 노출되지 않습니다. 응용 프로그램 계층에 대해 별도의 클래스에 데이터베이스 엔터티를 캡슐화하려는 경우에도 응용 프로그램이 실행할 수있는 쿼리 유형이 더 제한적 일지라도 여전히이 작업을 수행 할 수 있습니다.

// DAL 
public class Entity { ... } 

// BL 
public class EntityInfo : Entity { ... } 

... 

public IQueryable<EntityInfo> GetEntities() 
{ 
    return from e in dbContext.Entities 
      select new EntityInfo 
      { 
       // populate your application layer object 
      } 
} 

다음은 엔티티 클래스가 public을하는 동안 당신은 문맥 클래스 internal을 할 수 같은 결과를

public Expression<Func<Entity, EntityInfo>> materializeEntityInfo = 
    e => new EntityInfo { .. }; 

public IQueryable<EntityInfo> GetEntities() 
{ 
    return dbContext.Entities.Select(materializeEntityInfo); 
} 
+0

답장을 보내 주셔서 감사합니다.하지만 답변에서 DAL 레이어를 노출해야합니다. 그렇지 않으면 Linq 2 sql claases (Linq 2 sql이 각 테이블에 클래스를 작성)를 사용할 수 없습니다. 내 업데이트를 읽으십시오. 미리 감사드립니다. –

+0

GetEntities(). Where ((EntityInfo1) => EntityInfo1.Age> 40)이 코드를 실행하여 응용 프로그램 계층을 생성합니다. 모든 물체가 개조 된 후에는 먼저 모든 테이블을 숫양에 가져다가 40 세가 넘은 검색 허위 실체 만 발견 할 수 있습니다. 제가 찾을 수있는 최고의 유혹입니까? 테이블이 milions 엔티티로 구성되면 어떻게 될까요? –

+0

@StavAlfi 다른 데이터베이스 쿼리와 마찬가지로 작동합니다. 'IEnumerator '을 만들 때까지는 서버에서 코드를 실행하지 않습니다. 'OrderBy','Where','Take','Skip' 및 대부분의 다른 확장 메서드는 마치 데이터베이스 자체에 대해 실행 한 것처럼 작동합니다. –

0

을 제공하여 코딩의 또 다른 방법입니다.

enter image description here

이 클라이언트에 노출되지 않는 상황에서 (IEnumerable들로) 엔티티 클래스를 돌려 당신의 DAL에서 서비스 클래스를 만들 수있다.

사실이지만 DAL 추상이기 때문에 클라이언트 (또는 응용 프로그램 계층)에 DTO 또는보기 모델 개체가 노출되도록하는 것이 좋습니다 (p.wg에서 말한 것처럼).