2013-07-11 23 views
5

Tôi đang cố gắng tìm cách chính xác để tiêm đối tượng hiện tại của đối tượng UserAuthSession (bắt nguồn từ Service2's AuthUserSession) vào kho lưu trữ truy cập dữ liệu để chúng tự động cập nhật các trường theo dõi thay đổi trên các hoạt động chèn/cập nhật/xóa.Làm cách nào để tiêm ServiceStack AuthSession vào các lớp lưu trữ của tôi?

Nếu tôi là kho newing-up trong mã dịch vụ của tôi nó sẽ là không có trí tuệ, tôi sẽ chỉ làm:

var repo = new MyRepository(SessionAs<UserAuthSession>()); 

Tuy nhiên, các kho của tôi là tự động có dây (tiêm) vào các dịch vụ, nên UserAuthSession phải được nắm lấy từ đâu đó trong lambda định nghĩa cho đăng ký sử dụng kho lưu trữ với container IOC, ví dụ:

public class AppHost : AppHostBase 
{ 
    public override void Configure(Container container) 
    { 
     container.Register<ICacheClient>(new MemoryCacheClient()); 
     container.Register<IRepository>(c => 
     { 
      return new MyRepository(**?????**); <-- resolve and pass UserAuthSession 
     } 
    } 
} 

Bây giờ, nhìn vào mã ServiceStack cho lớp Service:

private object userSession; 
    protected virtual TUserSession SessionAs<TUserSession>() 
    { 
     if (userSession == null) 
     { 
      userSession = TryResolve<TUserSession>(); //Easier to mock 
      if (userSession == null) 
       userSession = Cache.SessionAs<TUserSession>(Request, Response); 
     } 
     return (TUserSession)userSession; 
    } 

Tôi có thể thấy rằng nó tìm kiếm phiên được lưu trong bộ nhớ cache dựa trên RequestResponse hiện tại, nhưng những thứ đó không có sẵn cho tôi trong lambda.

Giải pháp là gì? Hay tôi đang tiếp cận vấn đề từ một góc hoàn toàn sai?

+0

Quên đề cập đến mà tôi đang kiểm tra mã của tôi sử dụng một 'JsonServiceClient', KHÔNG bằng cách gọi phương thức dịch vụ trực tiếp. Vì vậy, tôi đã mong đợi 'HttpContext.Current' để có sẵn trong lambda, nhưng nó luôn luôn là null. –

Trả lời

6

Tìm câu trả lời trong another StackOverflow post để lưu trữ phiên được xây dựng từ yêu cầu trong từ điển ServiceStack.Common.HostContext yêu cầu/theo chủ đề. .

My AppHost.Configure() hiện nay có đoạn mã sau:

// Add a request filter storing the current session in HostContext to be 
// accessible from anywhere within the scope of the current request. 
RequestFilters.Add((httpReq, httpRes, requestDTO) => 
{ 
    var session = httpReq.GetSession(); 
    HostContext.Instance.Items.Add(Constants.UserSessionKey, session); 
}); 

// Make UserAuthSession resolvable from HostContext.Instance.Items. 
container.Register<UserAuthSession>(c => 
{ 
    return HostContext.Instance.Items[Constants.UserSessionKey] as UserAuthSession; 
}); 

// Wire up the repository. 
container.Register<IRepository>(c => 
{ 
    return new MyRepository(c.Resolve<UserAuthSession>()); 
}); 
+0

tuyệt vời nhưng làm thế nào để bạn lưu mọi thứ trở lại vào phiên làm việc? – fractal

+0

Tôi không quan tâm đến việc lưu bất cứ điều gì trở lại phiên, trong trường hợp của tôi đây là một con đường một chiều chỉ khi repos của tôi cần phải biết danh tính của người dùng đó là về để sửa đổi dữ liệu. –

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