Tôi cần một cách để lưu trữ đối tượng ghi nhật ký cho mỗi yêu cầu. Với HttpContext tôi sẽ thêm nó vào mục Dictionary. Tôi không muốn đưa HttpContext vào đây nếu tôi có thể giúp. Đoạn mã dưới đây là những gì tôi đề xuất cho Unity LifeTimeManager sẽ lưu trữ các đối tượng trong thuộc tính Môi trường của OwinContext, mà tôi có quyền truy cập vào với phần mềm trung gian Owin của tôi.Tôi có nên sử dụng Môi trường của OwinContext để lưu dữ liệu ứng dụng cụ thể theo yêu cầu
public class OwinContextLifetimeManager : LifetimeManager
{
private string key = (new Guid()).ToString();
private IDictionary<string, object> environment;
public OwinContextLifetimeManager(IDictionary<string, object> environment)
{
this.environment = environment;
}
public override object GetValue()
{
if (environment != null && environment.ContainsKey(key))
return environment[key];
else
return null;
}
public override void RemoveValue()
{
if (environment != null)
environment.Remove(key);
}
public override void SetValue(object newValue)
{
if (environment != null)
environment[key] = newValue;
}
}
Sau đó, tôi có thể sử dụng nó như thế này từ middleware của tôi:
container.RegisterType<IRequestLog, RequestLog>(new OwinContextLifetimeManager(environment));
Nó xảy ra với tôi rằng tôi có thể chọn bất cứ điều gì quan trọng tôi muốn ngoại trừ những người đã được bảo vệ bởi Owin. Có lý do nào tôi không nên sử dụng OwinContext.Environment cho mục đích này không? Các tài liệu MSDN là mơ hồ về các thực hành tốt nhất này.
Phản hồi của Darrel Miller tại đây: How should I store per request data when using OWIN to Self-Host ASP.NET Web API dẫn tôi tin rằng bộ sưu tập thuộc tính trên đối tượng yêu cầu là cách để đi. Làm cách nào để truy cập đối tượng này từ phần mềm trung gian?
Tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, "[Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?] (Http://meta.stackexchange.com/questions/19190/)", trong đó sự đồng thuận là "không, họ không nên". –
Tôi biết đây là một câu hỏi cũ, nhưng tôi chỉ muốn lưu ý nơi bạn tạo ra chìa khóa của bạn 'new Guid()' nên là 'Guid.NewGuid()'. 'new Guid()' tạo ra một guid rỗng (tất cả các số không - 'Guid.Empty') mỗi lần. –
Điều cần biết. Hóa ra vì nó lưu nó trong bối cảnh yêu cầu, tôi chỉ sử dụng một hằng số thay vì lưu một ID. – codetoast