저는 현재 Linq에서 Sql으로 자동 생성 된 코드 파일을 사용하는 대신 직접 Dto 클래스와 Datacontext를 사용합니다. 내 솔루션 아키텍처/모델링에 대한 배경 지식을 얻기 위해 "계약"프로젝트와 "달"프로젝트가 있습니다. (또한 "모델"프로젝트이지만 Dal에만 초점을 맞추려고 노력할 것입니다.) 내 자신의 Dtos와 Datacontext를 손으로 돌려서 모든 것을 훨씬 작고 단순하게 만들었습니다. 여기서 내가 어떻게하는지 몇 가지 예를 들려 드리겠습니다.
나는 Dal의 외부에서 Dto 객체를 반환하지 않습니다. 사실 나는 그것들을 내부로 선언해야합니다. 내가 그들을 반환하는 방법은 인터페이스로 (인터페이스가 내 "계약"계층에 위치 함) 그들을 캐스팅하는 것입니다. 우리는 "IPersonRetriever와 IPersonSaver"인터페이스를 구현하는 간단한 "PersonRepository"를 만들 것입니다.
계약 :
public interface IPersonRetriever
{
IPerson GetPersonById(Guid personId);
}
public interface IPersonSaver
{
void SavePerson(IPerson person);
}
달 :
public class PersonRepository : IPersonSaver, IPersonRetriever
{
private string _connectionString;
public PersonRepository(string connectionString)
{
_connectionString = connectionString;
}
IPerson IPersonRetriever.GetPersonById(Guid id)
{
using (var dc = new PersonDataContext(_connectionString))
{
return dc.PersonDtos.FirstOrDefault(p => p.PersonId == id);
}
}
void IPersonSaver.SavePerson(IPerson person)
{
using (var dc = new PersonDataContext(_connectionString))
{
var personDto = new PersonDto
{
Id = person.Id,
FirstName = person.FirstName,
Age = person.Age
};
dc.PersonDtos.InsertOnSubmit(personDto);
dc.SubmitChanges();
}
}
}
PersonDataContext :
internal class PersonDataContext : System.Data.Linq.DataContext
{
static MappingSource _mappingSource = new AttributeMappingSource(); // necessary for pre-compiled linq queries in .Net 4.0+
internal PersonDataContext(string connectionString) : base(connectionString, _mappingSource) { }
internal Table<PersonDto> PersonDtos { get { return GetTable<PersonDto>(); } }
}
[Table(Name = "dbo.Persons")]
internal class PersonDto : IPerson
{
[Column(Name = "PersonIdentityId", IsPrimaryKey = true, IsDbGenerated = false)]
internal Guid Id { get; set; }
[Column]
internal string FirstName { get; set; }
[Column]
internal int Age { get; set; }
#region IPerson implementation
Guid IPerson.Id { get { return this.Id; } }
string IPerson.FirstName { get { return this.FirstName; } }
int IPerson.Age { get { return this.Age; } }
#endregion
}
당신은, 당신의 DTO의 모든 속성에 "열"속성을 추가해야하지만 경우 인터페이스에서와 같이 필드를 노출하려는 대상과 일대일 상관 관계가있는 경우 실제 테이블 컬럼의 이름이면 Named Parameters를 추가 할 필요가 없습니다. 이 예제에서 데이터베이스의 PersonId는 "PersonIdentityId"로 저장되지만, 필자의 인터페이스에서 "Id"라고 말하는 필드 만 만들면됩니다.
내가 Dal 레이어를 어떻게 사용하는지,이 레이어는 멍청하고 실제 바보 같아야한다고 생각합니다. CRUD (Create, Retrieve, Update 및 Delete) 작업에만 해당된다는 의미에서 바보입니다.모든 비즈니스 로직은 IPersonSaver 및 IPersonRetriever 인터페이스를 사용하고 사용하는 "모델"프로젝트에 포함됩니다.
희망이 도움이됩니다.
훨씬 더 의미가 있습니다. 나는 가지고있는 질문, 이것이 자동 생성 클래스의 기능을 어떻게 활용합니까? 그것은 좋은 seperation을 가지고 싶다면 여전히 할 배관의 좋은 금액이있는 것 같습니다. – Aur
당신이 그 길로 가면 정말로해야 할 일이 많이 있습니다. 그래서 자동 생성 클래스를 직접 사용하지 않습니다. 이런 식으로 손을 굴려 보면 코드가 적고 코드가 적으며 디버깅이 쉬우 며 분리가 더 쉽습니다. –
linq을 사용하여 저장 프로 시저를 추상화하고 기본적인 crud 작업을보다 쉽게 수행 할 수 있습니다. 좋아요, 그 말이 많은 의미가 있습니다. 나는 코드 반복을 줄이는 데 사용할 수 있는지 알아보기 위해 제네릭을 살펴 보았습니다. – Aur