2010-03-05 23 views
5

Trong ứng dụng của tôi, tôi có một tình huống mà chúng ta cần phải nắm bắt khi nào một bản ghi được tạo ra và sửa đổi và những gì người dùng thực hiện các hành động đó. Vì vậy, tôi có thể có một đối tượng giống như:Thực tiễn tốt nhất để thiết lập sửa đổi lần cuối và ai đã sửa đổi bằng NHibernate?

public class Product 
{ 
    int Id; 
    int Name; 
    DateTime CreatedOn; 
    int CreatedByUserId; 
    DateTime LastModifiedOn; 
    int LastModifiedByUserId; 
} 

Thực tiễn tốt nhất để xử lý những điều này trong NHibernate là gì? Thông qua việc sử dụng thiết bị chặn như thông tin được mô tả here?

Trả lời

1

Tôi không nghĩ rằng thực hành "tốt nhất", nhưng việc sử dụng trình xử lý sự kiện phổ biến hơn cho điều này. Có một ví dụ tốt tại http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx

Một điều bạn cần xem xét là bạn cần lưu trữ userId đó ở đâu đó. Tôi hiện đang làm điều đó bằng cách gán một thuộc tính tĩnh trên trình nghe khi khởi động. Nó không đẹp, nhưng nó hoàn thành công việc.

+0

Bằng cách nào đó tôi đã nghĩ rằng đó sẽ là câu trả lời :) Tôi đoán tôi đã không thực sự tìm kiếm "tốt nhất" nhưng "được đề xuất" –

+0

Chúng tôi làm điều gì đó tương tự nhưng chuyển một 'Func 'sang" auditer "của chúng tôi. Để thử nghiệm, chúng ta chỉ cần trả về một giá trị cố định và trong quá trình sản xuất, chúng ta chuyển một hàm gọi là 'HttpContext.Current.User' –

+0

@Diego Mijelshon Yuck rằng IS xấu xí ... không may là tôi nghĩ mình sẽ phải làm như vậy! – richard

0

Tôi đồng ý với Diego rằng tôi không nghĩ rằng có phương pháp hay nhất. Nó phụ thuộc vào ngữ cảnh ứng dụng của bạn. Trong liên kết của Diego, và sử dụng các trình lắng nghe sự kiện ở mức độ kiên trì (nHibernate), nó cần phải biết cách tra cứu người dùng hiện tại. Điều này có thể không có ý nghĩa tùy thuộc vào ứng dụng của bạn. Ví dụ, nếu bạn đang viết một ứng dụng ASP.NET MVC, bạn có thực sự muốn lớp kiên trì của bạn phụ thuộc vào HttpContext để biết người dùng không? Có, bạn có thể vượt qua trong một số loại chiến lược, nhưng điều này không có vẻ như nó luôn luôn là điều đúng đắn để làm.

Tôi nghĩ hoàn toàn hợp lệ để lớp dịch vụ của bạn xây dựng đối tượng và thêm chính người sáng tạo. Sau đó vượt qua toàn bộ đối tượng, với người sáng tạo đã ngậm nước, xuống nHibernate để tồn tại. Người tạo sẽ được lưu vào cơ sở dữ liệu giống như bất kỳ thuộc tính nào khác.

+0

Ứng dụng của tôi (ASP.NET MVC) được cấu trúc bằng cách sử dụng kho lưu trữ và vì vậy việc truyền thông tin người dùng sẽ rất thú vị. Tôi chắc chắn không muốn các repos có tham chiếu trực tiếp đến HttpContext vì vậy tôi sẽ cần phải tìm một cách để chuyển thông tin đó đến kho lưu trữ một cách tao nhã. –

+0

Bạn có thể chiến lược hóa nó; tạo một loại ICurrentUserProvider và chuyển nó xuống từ lớp điều khiển/dịch vụ. ICurrentUserProvier sẽ có một đại biểu trỏ đến một phương thức sử dụng HttpContext để giải quyết người dùng hiện tại. Điều đó nói rằng, đây vẫn là một sự vi phạm của DIP và nên tránh nếu có thể. – manu08

+0

Tôi sử dụng IoC để tiêm người dùng khi cần thiết, một cái gì đó như thế này trong autofac: builder.Register (c => HttpContext.Current.User) .HttpRequestScoped(); – UpTheCreek

Các vấn đề liên quan