Dưới đây là một liên kết đến (ít nhất là một phần của) NHibernate "bối cảnh" thực hiện:
https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Context/
Nó không phải là rõ ràng với tôi chính xác nơi hoặc cách này đi vào chơi trong bối cảnh NHibernate. Đó là, nếu tôi muốn lưu trữ một số giá trị trong "bối cảnh" tôi sẽ nhận được "bối cảnh" từ NHibernate và thêm giá trị của tôi? Tôi không sử dụng NHibernate, vì vậy tôi không thực sự biết.
Tôi cho rằng bạn có thể xem xét và tự xác định xem loại triển khai này có hữu ích cho bạn hay không. Rõ ràng ý tưởng sẽ là để tiêm thực hiện mong muốn, tùy thuộc vào loại ứng dụng (ASP.NET, WCF, vv). Điều đó có thể ngụ ý một số cấu hình (có thể tối thiểu nếu một người sử dụng MEF để tải giao diện "ICurrentSessionContext").
Dù sao đi nữa, tôi thấy ý tưởng này thú vị khi tôi tìm thấy nó một thời gian trước khi tìm kiếm thông tin về CallContext.SetData/GetData/LogicalSetData/LogicalGetData
, Thread.SetData/GetData
, [ThreadStatic]
vv
Ngoài ra, dựa trên việc bạn sử dụng CallContext.LogicalSetData
hơn CallContext.SetData
, tôi giả sử rằng bạn muốn tận dụng lợi thế của thực tế là thông tin liên quan đến luồng logic sẽ được truyền cho các chủ đề con thay vì chỉ muốn một nơi "an toàn luồng" để lưu trữ thông tin.Vì vậy, nếu bạn đã đặt (pr Push) AmbientActivity trong khởi động ứng dụng của bạn và sau đó không đẩy bất kỳ hoạt động nào nữa, bất kỳ chủ đề tiếp theo nào cũng sẽ là một phần của hoạt động đó vì dữ liệu được lưu trữ qua LogicalSetData được thừa hưởng bởi các chuỗi con.
Nếu bạn đã học bất cứ điều gì trong thời gian chờ đợi kể từ lần đầu tiên bạn đặt câu hỏi này, tôi rất muốn nghe về nó. Ngay cả khi bạn không có, tôi sẽ quan tâm đến việc tìm hiểu về những gì bạn đang làm với bối cảnh.
Hiện tại, tôi đang làm việc để duy trì một số thông tin ngữ cảnh cho ghi nhật ký/truy tìm (tương tự như Trace.CorrelationManager.ActivityId và Trace.CorrelationManager.LogicalOpertionStack và hỗ trợ ngữ cảnh log4net/NLog). Tôi muốn lưu một số bối cảnh (ứng dụng hiện tại, ví dụ ứng dụng hiện tại, hoạt động hiện tại (có thể lồng nhau)) để sử dụng trong một ứng dụng hoặc dịch vụ WCF VÀ tôi muốn truyền nó tự động qua ranh giới dịch vụ WCF. Điều này là để cho phép các khai báo đăng nhập được đăng nhập trong một kho lưu trữ trung tâm được tương quan bởi client/activity/etc. Chúng ta sẽ có thể truy vấn và tương quan cho tất cả các câu lệnh khai thác gỗ bằng một cá thể cụ thể của một ứng dụng cụ thể. Các câu lệnh đăng nhập có thể đã được tạo ra trên máy khách hoặc trong một hoặc nhiều dịch vụ WCF.
Tuyên truyền WCF của ActivityId không nhất thiết là đủ cho chúng tôi bởi vì chúng tôi muốn tuyên truyền (hoặc chúng tôi nghĩ chúng tôi làm) nhiều hơn chỉ là ActivityId. Ngoài ra, chúng tôi muốn truyền bá thông tin này từ các máy khách Silverlight tới các dịch vụ WCF và Trace.CorrelationManager không có sẵn trong Silverlight (ít nhất là không có trong 4.0, có thể một cái gì đó giống như nó sẽ có sẵn trong tương lai).
Hiện tại tôi đang tạo mẫu việc truyền bá thông tin "ngữ cảnh" của chúng tôi bằng cách sử dụng IClientMessageInspector và IDispatchMessageInspector. Có vẻ như nó sẽ hoạt động tốt cho chúng tôi.
Về sự phụ thuộc vào System.Web, triển khai NHibernate có một "ReflectiveHttpContext" sử dụng phản chiếu để truy cập HttpContext do đó sẽ không có sự phụ thuộc của dự án trên System.Web. Rõ ràng, System.Web sẽ phải có sẵn khi ứng dụng được triển khai nếu HttpContext được cấu hình để sử dụng.
Tôi không có nhiều để cung cấp, nhưng tôi cũng quan tâm đến vấn đề này. FWIW tôi nhớ lại nhìn thấy trong một số kho lưu trữ nguồn (có lẽ Castle, NInject, hoặc NHibernate) một số triển khai của một cái gì đó như IContext mà tôi đoán được dự định bằng DI'd vào một ứng dụng. Mỗi triển khai IContext sử dụng một công nghệ khác nhau (CallContext, HttpContext, Thread.SetData, vv). Tôi không biết chính xác chúng được sử dụng như thế nào, nhưng suy nghĩ đầu tiên của tôi là nó trừu tượng hóa "Bối cảnh". Dù sao, tôi có thể xem nếu tôi có thể tìm thấy những gì tôi tìm thấy trước và gửi một liên kết. Nó có thể hữu ích. – wageoghe