我试图找出最干净的方法来做到这一点。
目前我有一个客户对象:
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 返回给客户?
我猜“Factory”可能是错误的词,但我应该有另一种类型的 EmailFactory,它从 DataAccessLayer 获取一个 DataTable 并将一个 List 返回给 Email 对象?我想那种听起来是多余的......
将我的 Email.getEmails(id) 作为静态方法是否是正确的做法?
我可能只是试图找到最好的“模式”并将其应用到通常是一项简单的任务中。
谢谢。
跟进
我创建了一个工作示例,其中我的域/业务对象通过 id 从现有数据库中提取客户记录。nhibernate 中的 xml 映射文件非常整洁。在我按照教程设置会话和存储库工厂之后,提取数据库记录非常简单。
但是,我注意到性能受到巨大影响。
我的原始方法包括数据库上的存储过程,由 DAL 对象调用,它将结果集解析为我的域/业务对象。
我用 30 毫秒的时间记录了我最初的方法来获取一条客户记录。然后,我将 nhibernate 方法计时为 3000 毫秒以获取相同的记录。
我错过了什么吗?或者使用这条休眠路由是否有很多开销?
否则我喜欢代码的简洁性:
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;
}
}
}
我遵循的示例让我创建了一个帮助类来帮助管理会话,也许这就是我得到这个开销的原因?
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 秒,那将是一个巨大的打击。但是,如果我正在做一些奇怪的事情并且这是一次性的初始设置成本,那么如果性能与在数据库上执行存储过程一样好,那么它可能是值得的。
仍然愿意接受建议!
更新。
我正在废弃我的 ORM/NHibernate 路线。我发现性能太慢了,无法证明使用它是合理的。对于我们的环境来说,基本的客户查询需要的时间太长了。与亚秒级响应相比,3 秒太多了。
如果我们想要慢速查询,我们只需保留当前的实现。重写它的想法是大幅增加时间。
然而,在上周玩过 NHibernate 之后,它是一个很棒的工具!它只是不太适合我对这个项目的需求。