Tôi mới dùng NHibernate (và ORMS) và cố gắng nắm bắt được vô số các tùy chọn khác nhau mà nó trình bày. Để tham khảo, tôi đang sử dụng Fluent NHibernate với các đối tượng kinh doanh riêng biệt mà lần lượt sử dụng DTO hoàn toàn cho truy cập dữ liệu. Kiến trúc ứng dụng của tôi phải hỗ trợ cả hai cửa sổ và web "giao diện người dùng".Cách tiếp cận tốt nhất để xây dựng NHibernate DTO's
Việc quấy rối của tôi là một trong những cách tiếp cận chung vì dường như có rất nhiều tùy chọn. DTO của tôi trông giống như mẫu dưới đây. Mỗi DTO có một tham chiếu đến một ISession được chuyển cho chúng từ BO. Họ có trách nhiệm tải của mình và tiết kiệm:
public class EmployeeDTO...
// Data Properties to be persisted to the database
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual ISession Session { get; set; }
// Save logic
public virtual void Save()
{
var transaction = Session.BeginTransaction();
Session.SaveOrUpdate(this);
transaction.Commit();
}
// Load logic
public virtual void Load(int id)...
Trước hết: Đây có phải là cách tiếp cận đúng để có - nên DTO có khả năng lưu và tải bản thân?
Thứ hai: Bất kể nơi lưu/code tải nằm, bạn nên sử dụng cùng một ISession cho các đời hoặc một đối tượng, hoặc họ cần phải có một ref đến ISessionFactory và mở một phiên mới mọi tương tác cơ sở dữ liệu thời gian bắt buộc?
// Open a new session every time I interact with the repository
var session = FluentSupport.SessionFactory.OpenSession();
var transaction = Session.BeginTransaction();
Session.SaveOrUpdate(this);
transaction.Commit();
session.Close();
// Close the session when I'm done
Tất nhiên luôn có phương án 3, không có ở trên :)
Khi một đối tượng biết cách Lưu chính nó được gọi là DAO, điều này không liên quan gì đến DTO –