나는 이것을 수행하는 가장 깨끗한 방법을 찾으려고합니다.비즈니스 개체에 대한 데이터 액세스 계층에 가장 적합한 "패턴"
public class Customer
{
public int Id {get;set;}
public string name {get;set;}
public List<Email> emailCollection {get;set}
public Customer(int id)
{
this.emailCollection = getEmails(id);
}
}
그런 다음 내 이메일 객체가 아주 기본입니다 :
현재 전 고객 개체가 있습니다.public class Email
{
private int index;
public string emailAddress{get;set;}
public int emailType{get;set;}
public Email(...){...}
public static List<Email> getEmails(int id)
{
return DataAccessLayer.getCustomerEmailsByID(id);
}
}
DataAccessLayer 현재 데이터베이스에 연결하고, 결과 집합을 반복하는 SqlDataReader 개체를 사용하여 새로운 이메일 객체를 생성하고 할 때 반환하는 목록에 추가합니다.
어디서 어떻게 개선 할 수 있습니까?
DataAccessLayer 대신 DataTable을 반환하고이를 전자 메일 개체로 남겨두면 분석 결과를 고객에게 반환 할 수 있습니까?
"Factory"는 아마도 잘못된 단어 일 것 같지만 DataAccessLayer에서 DataTable을 가져 와서 Email 객체에 List를 반환하는 다른 유형의 EmailFactory가 있어야합니까? 그런 종류의 소리가 중복되는 것 같아요.
내 Email.getEmails (id)를 정적 방법으로 사용하는 것이 합당한 방법입니까?
평소에 간단한 작업으로 가장 좋은 "패턴"을 찾아 적용하려고 시도해 보았습니다.
감사합니다.
는 후속 는 내 도메인/비즈니스 오브젝트가 기존 데이터베이스에서 ID로 고객 레코드를 추출하는 작업 예제를 만들었습니다. nhibernate의 xml 매핑 파일은 정말 멋지다. 튜토리얼을 따라 세션과 저장소 팩토리를 설정 한 후에 데이터베이스 레코드를 가져 오는 것은 꽤나 간단했습니다.
그러나 엄청난 성능 저하가 나타났습니다.
내 원본 메서드는 결과 집합을 내 도메인/비즈니스 개체로 구문 분석 한 DAL 개체에서 호출 한 DB의 저장 프로 시저로 구성됩니다.
나는 단일 고객 기록을 얻기 위해 30 밀리 잡기로 나의 원래 방법을 계시했다. 나는 같은 기록을 얻기 위해 3000ms를 복용하면서 nhibernate 방법을 기록했다.
내가 누락 된 항목이 있습니까? 아니면이 nhibernate 경로를 사용하여 오버 헤드가 많이 있습니까?
그렇지 않으면 나는 코드의 청결을 좋아한다 :protected void Page_Load(object sender, EventArgs e)
{
ICustomerRepository repository = new CustomerRepository();
Customer customer = repository.GetById(id);
}
public class CustomerRepository : ICustomerRepository
{
public Customer GetById(string Id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
Customer customer = session
.CreateCriteria(typeof(Customer))
.Add(Restrictions.Eq("ID", Id))
.UniqueResult<Customer>();
return customer;
}
}
}
example I followed 제가이 오버 헤드를 받고 있어요 왜 아마도 그건, 세션을 관리하는 데 도움이 헬퍼 클래스를 생성했다?
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
Configuration cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly(typeof(Customer).Assembly);
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
내가 작업하고있는 응용 프로그램을 사용하면 속도가 핵심입니다. 궁극적으로 많은 양의 데이터가 웹 앱과 데이터베이스간에 전달됩니다. 3 초가 아니라 고객 레코드를 끌어 올리기 위해 1/3 초의 에이전트가 필요하다면 큰 타격을 입을 것입니다.하지만 내가 이상한 일을하고 있는데 이것은 초기 설치 비용이 한 번만 들었다면 DB의 저장 프로 시저를 실행하는 것만 큼 성능이 좋았다면 가치가있을 것입니다.
아직 제안이 없습니다!
업데이트 됨.
나는 내 ORM/NHibernate 경로를 폐기하고 있습니다. 나는 그것을 사용하는 것을 정당화하기에는 성능이 너무 느리다는 것을 발견했다. 기본 고객 쿼리는 우리 환경에 너무 오래 걸립니다. 1 초 미만의 응답에 비해 3 초가 너무 많습니다.
우리가 느린 쿼리를 원한다면 우리는 현재의 구현을 유지할 것입니다. 그것을 재 작성하는 아이디어는 시간을 크게 늘리는 것이 었습니다.
그러나 지난 주 NHibernate와 함께 해본 결과 훌륭한 도구입니다! 이 프로젝트에 대한 나의 요구에 꼭 맞지 않습니다.
Barry- 그래, 지금 당장 위대한 일을하고 있습니다. 내가 생각할 수있는 것은 DataAccessLayer가 DataTable을 반환하도록함으로써 데이터 액세스 레이어 대신 비즈니스 레이어 (즉, 이메일 개체)에서 유효성 검사를 수행 할 수 있도록하는 것입니다. –
게시 한 예는 고전적인 "빈혈 도메인 모델"입니다. 귀하의 예를 기반으로하면 비즈니스 객체조차 필요하지 않습니다. 비즈니스 객체는 비즈니스 로직을 유지해야하며, 비즈니스 로직은 보유하지 않아야합니다. –