我正在尝试找出最简洁的方法来完成这个操作。
目前我有一个客户对象:
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迭代结果集并创建新的Email对象,并将它们添加到List中,完成后返回该列表。那么我应该在哪里和如何改进呢?
我应该让我的DataAccessLayer返回一个DataTable,然后由Email对象解析并返回一个List返回给客户端吗?
我猜“工厂”可能不是正确的词,但我是否应该有另一种类型的EmailFactory,它从DataAccessLayer获取一个DataTable,并向Email对象返回一个List?这听起来好像有点多余…
将Email.getEmails(id)方法作为静态方法,这是适当的做法吗?
也许我只是试图找到并应用最佳“模式”来完成通常是简单任务的工作。
谢谢。
跟进:
我创建了一个可行的示例,在现有数据库中,我的Domain/Business对象通过ID提取客户记录。nhibernate中的xml映射文件非常棒。在我按照教程设置会话和存储库工厂之后,获取数据库记录非常直观。
然而,我注意到性能损失很大。
我的原始方法包括在DB上的存储过程,由DAL对象调用,将结果集解析成我的领域/业务对象。
我测量了原始方法,花费30毫秒来获取单个客户记录。然后我测量了nhibernate方法,花费3000毫秒来获取相同的记录。
我有什么遗漏吗?还是使用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;
}
}
}
我按照这个示例创建了一个帮助类来管理Session,也许这就是我遇到开销的原因?
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();
}
}
我正在处理的应用程序需要具有高速度。而且,网页应用程序和数据库之间将会传递大量数据。如果拉取客户记录需要1/3秒而不是3秒,那将是一个巨大的优势。但是,如果我在做一些奇怪的事情,这是一次性的初始设置成本,那么如果性能与在DB上执行存储过程一样好,那可能值得一试。
仍然欢迎建议!
更新。
我放弃了ORM/NHibernate路线。我发现它的性能太慢了,无法证明使用它的价值。我们的环境下基本的客户查询需要太长时间。比起亚秒级响应,3秒钟太长了。
如果我们想要慢查询,我们就可以继续使用我们目前的实现。重写的想法是为了显著提高查询速度。
然而,在过去的一周里尝试了NHibernate后,我认为它是一个非常好的工具!只是它不完全符合我的项目需求。