Một vài ngày trước, tôi đã gặp vấn đề này với luồng ASP.Net. Tôi muốn có một đối tượng singleton cho mỗi yêu cầu web. Tôi thực sự cần điều này cho đơn vị công việc của tôi. Tôi muốn khởi tạo một đơn vị công việc cho mỗi yêu cầu web để bản đồ nhận dạng hợp lệ thông qua yêu cầu. Bằng cách này tôi có thể sử dụng một IoC để tiêm IUnitOfWork của riêng tôi vào các lớp kho lưu trữ của tôi một cách minh bạch, và tôi có thể sử dụng cùng một cá thể để truy vấn và sau đó cập nhật các thực thể của mình.Singleton Per Call Context (Yêu cầu Web) trong Unity
Vì tôi đang sử dụng Unity, tôi đã sử dụng nhầm PerThreadLifeTimeManager. Tôi sớm nhận ra rằng mô hình luồng ASP.Net không hỗ trợ những gì tôi muốn đạt được. Về cơ bản nó sử dụng một theadpool và tái chế chủ đề, và điều đó có nghĩa là tôi nhận được một UnitOfWork cho mỗi chủ đề !! Tuy nhiên, những gì tôi muốn là một đơn vị công việc cho mỗi yêu cầu web.
Một chút googling đã cho tôi this great post. Đó là chính xác những gì tôi muốn; ngoại trừ phần thống nhất khá dễ dàng để đạt được.
Đây là triển khai thực hiện của tôi cho PerCallContextLifeTimeManager cho sự hiệp nhất:
public class PerCallContextLifeTimeManager : LifetimeManager
{
private const string Key = "SingletonPerCallContext";
public override object GetValue()
{
return CallContext.GetData(Key);
}
public override void SetValue(object newValue)
{
CallContext.SetData(Key, newValue);
}
public override void RemoveValue()
{
}
}
Và dĩ nhiên là tôi sử dụng để đăng ký đơn vị của tôi làm việc với một mã tương tự như sau:
unityContainer
.RegisterType<IUnitOfWork, MyDataContext>(
new PerCallContextLifeTimeManager(),
new InjectionConstructor());
Hy vọng nó sẽ giúp tiết kiệm một ai đó một chút thời gian.
Giải pháp tốt. Nếu tôi có thể, tôi khuyên bạn nên đổi tên thành "CallContextLifetimeManager" vì yêu cầu web có lẽ chỉ là một trong những ứng dụng tiềm năng. –
Đúng, tôi đã cập nhật văn bản và mã để phản ánh điều đó. Cảm ơn. –
+1 Rất hữu ích. – MrDustpan