현재 Entity Framework 5 (.net 4)를 데이터 액세스 전략으로 사용하는 n 계층 솔루션을 설계하고 있지만 의존성 주입을 통합하여 테스트 가능하고 유연하게 만드는 방법에 대해 우려하고 있습니다.
현재 솔루션 레이아웃은 다음과 같습니다 (내 솔루션은 Alcatraz라고 함).
Alcatraz.WebUI : 프론트 엔드 사용자 인터페이스 인 asp.net 웹 양식 프로젝트는 Alcatraz.Business 및 Alcatraz.Data.Models 프로젝트를 참조합니다 .
Alcatraz.Business : 비즈니스 라이브러리를 포함하는 클래스 라이브러리 프로젝트, 프로젝트 Alcatraz.Data.Access , Alcatraz.Data.Models 참조
Alcatraz.Data.Access : 클래스 라이브러리 프로젝트, 주택 AlcatrazModel.edmx 및 AlcatrazEntities
DbContext, 참조하는 프로젝트 Alcatraz.Data.Models .
Alcatraz.Data.Models : 클래스 라이브러리 프로젝트로, 알카트라즈 모델에 대한 POCO를 포함하며 참조는 없습니다.
이 솔루션의 작동 방식에 대한 나의 비전은 웹 UI가 비즈니스 라이브러리 내에서 저장소를 인스턴스화하는 것이며,이 저장소는 (생성자가 아닌) 연결 문자열 ( AlcatrazEntities
인스턴스 아님)의 종속성을 갖습니다 . web-ui는 데이터베이스 연결 문자열을 알고 있지만 엔터티 프레임 워크 연결 문자열 인 것은 아닙니다.
비즈니스 프로젝트에서 :
public class InmateRepository : IInmateRepository
{
private string _connectionString;
public InmateRepository(string connectionString)
{
if (connectionString == null)
{
throw new ArgumentNullException("connectionString");
}
EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder();
connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl";
connectionBuilder.Provider = "System.Data.SqlClient";
connectionBuilder.ProviderConnectionString = connectionString;
_connectionString = connectionBuilder.ToString();
}
public IQueryable<Inmate> GetAllInmates()
{
AlcatrazEntities ents = new AlcatrazEntities(_connectionString);
return ents.Inmates;
}
}
웹 UI에서 :
IInmateRepository inmateRepo = new InmateRepository(@"data source=MATTHEW-PC\SQLEXPRESS;initial catalog=Alcatraz;integrated security=True;");
List<Inmate> deathRowInmates = inmateRepo.GetAllInmates().Where(i => i.OnDeathRow).ToList();
이 디자인에 대한 몇 가지 관련 질문이 있습니다.
이 디자인은 Entity Frameworks 기능 측면에서도 의미가 있습니까? 엔티티 프레임 워크가 이미 작업 단위 패턴을 사용한다고 들었습니다. 불필요하게 다른 추상 레이어를 추가하고 있습니까?
내 웹 UI가 Entity Framework와 직접 통신하기를 원치 않으며 (또는 그 문제를 참조하기 위해) 향후 동일한 비즈니스 계층을 사용하는 여러 프로젝트가있을 때 모든 데이터베이스 액세스가 비즈니스 계층을 통과하기를 원합니다. (웹 서비스, Windows 응용 프로그램 등) 하나의 중앙 영역에 비즈니스 논리를 가짐으로써 유지 관리 / 업데이트를 쉽게하고 싶습니다. 이것이 이것을 달성하는 적절한 방법입니까?
비즈니스 계층에 리포지토리가 포함되어야합니까, 아니면 액세스 계층 내에 포함되어야합니까? 그들이 어디에 있는지, 연결 문자열을 전달하는 것이 좋은 의존성을 가정합니까?
읽어 주셔서 감사합니다!
DbContext
의존성을 a 로 받아들 입니다. 비즈니스 클래스에는 저장소가 종속성으로 있습니다. 의존성 주입의 경우 수동 으로이 작업을 수행하고 있습니다 (그래서 진행 상황을 이해합니다). 연결 문자열을 설정하려는 이유DbContext
는 데이터베이스 샤딩을 사용하기 때문에 특정 경우 동일한 구조의 다른 데이터베이스에 연결하기 위해 엔티티 프레임 워크가 필요하기 때문입니다. 내가 당신을 제대로 이해합니까?