2009-04-01 31 views
17

Tôi đang cân nhắc việc sử dụng Unity để quản lý tuổi thọ của cá thể lớp người dùng tùy chỉnh. Tôi đang lên kế hoạch mở rộng LifetimeManager bằng một trình quản lý phiên ASP.NET tùy chỉnh. Những gì tôi muốn có thể làm là lưu trữ và lấy đối tượng người dùng hiện đang đăng nhập từ các lớp tùy chỉnh của tôi, và có Unity lấy cá thể Người dùng từ đối tượng phiên trong ASP.NET, hoặc (khi trong dự án Win32) lấy nó tĩnh hoặc từ luồng hiện tại.Sử dụng phiên ASP.NET để quản lý trọn đời (Unity)

Cho đến nay giải pháp tốt nhất của tôi là tạo một thể hiện tĩnh của container Unity khi khởi động và sử dụng phương thức Resolve để lấy đối tượng User của tôi từ mỗi lớp của tôi. Tuy nhiên, điều này dường như tạo ra một sự phụ thuộc vào container thống nhất trong các lớp khác của tôi. "Thống nhất" cách hoàn thành mục tiêu này là gì? Tôi muốn có thể đọc/thay thế cá thể User hiện tại từ bất kỳ lớp nào.

+0

Bạn có ý nghĩa gì với "trình quản lý phiên ASP.NET tùy chỉnh"? Bạn đang nói về một phiên NHibernate hoặc một Data/ObjectContext? –

Trả lời

0

Tôi nghĩ rằng bạn cần hai dịch vụ mà bạn vạch trần thông qua sự hợp nhất (hoặc một dịch vụ thực hiện cả hai hành động).

Thay vì lưu trữ đối tượng người dùng, lưu trữ triển khai giao diện hiển thị một phương thức/thuộc tính sẽ nhận đối tượng người dùng cho bạn. Trong trường hợp ASP.NET, bạn lấy người dùng từ phiên. Trong giải pháp WinForm (hoặc bất kỳ), bạn có thể lấy nó từ chuỗi thực hiện.

Bạn cũng sẽ có một phương thức/thuộc tính được đặt, mà bạn sẽ sử dụng để đặt người dùng.

+0

Bạn có thể cung cấp ví dụ Pseudocode không? Tôi không hiểu làm thế nào phản ứng của bạn sử dụng Unity, hoặc làm thế nào nó cho phép một lớp duy nhất để lấy người dùng mà không biết nếu lớp đang được sử dụng trong ASP.NET hoặc WinForm. –

2

Tại sao không sử dụng đối tượng bộ nhớ cache thay vì ... sau đó bạn có thể sử dụng nó cả hai từ chiến thắng và web. Như thế này:

IUnityContainer container= HttpRuntime.Cache.Get("Unity") as IUnityContainer; 

    if (container == null) 
    { 
     container= // init container 

     HttpRuntime.Cache.Add("Unity", 
      container, 
      null, 
      Cache.NoAbsoluteExpiration, 
      Cache.NoSlidingExpiration, 
      CacheItemPriority.NotRemovable, 
      null); 
    } 

    // return container or something 

HttpRuntime.Cache sẽ làm việc cả trong chiến thắng và web

-5

lời xin lỗi của tôi nếu đây không phải là hoàn toàn đúng nhưng ...

Unity là một nền tảng trò chơi dev, do đó tôi giả sử rằng bạn đang xây dựng một ứng dụng hoặc trò chơi 3D mà bạn dự định làm điều gì đó tuyệt vời với (ví dụ: làm cho người dùng sử dụng máy chủ nhiều người dùng/theo dõi tiến trình).

Tại sao không có mỗi người dùng đăng nhập, sau đó bạn có thể sử dụng các lớp MembershipProvider và Formsauthentication để lấy acces cho id/tên người dùng.

Trên máy chủ của bạn, bạn chỉ cần liên kết tất cả thông tin với người dùng cho phép bạn dễ dàng kéo lùi dữ liệu (yêu cầu http/yêu cầu http bình thường) phù hợp với yêu cầu về tình hình/người dùng.

Tôi không biết điều này chắc chắn nhưng tôi tin rằng sự thống nhất là cái gì đó triển khai phía khách hàng do đó không có tích hợp với nó cần phải được thực hiện trên máy chủ.

Chỉ cần yêu cầu những gì bạn cần và xử lý ở phía khách hàng.

Bằng cách đó bạn gắn vào mẫu thiết kế n-tier cổ điển cho phép bạn tách logic của mình khỏi lưu trữ dữ liệu và ui.

Hope this helps ...

+0

Xin lỗi nhưng câu trả lời của bạn chỉ trỏ đến một con đường hoàn toàn khác thay vì cung cấp giải pháp cho một câu hỏi rất súc tích. – JCallico

+2

Sai Unity, hãy xem http://unity.codeplex.com/. Đó là thư viện tiêm phụ thuộc. – marijne

13

Bạn muốn có hiệu quả nhất với Unity khi được sử dụng với ASP.Net MVC hơn là đồng bằng dự án ASP.Net cũ. ASP.Net MVC cho phép bạn sử dụng một container như Unity để quản lý các đối tượng người dùng, bộ điều khiển, mô hình, vv Nếu có thể, hãy sử dụng MVC thay vì ASP.biểu mẫu web net cho dự án của bạn.

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, bạn sẽ muốn sử dụng Unity để duy trì tuổi thọ của đối tượng để mỗi phiên. Bạn cần triển khai SessionLifetimeManager kéo dài LifetimeManager. Mã này khá đơn giản và đi dọc theo các dòng sau:

public class SessionLifetimeManager : LifetimeManager 
{ 
    private string _key = Guid.NewGuid().ToString(); 

    public override object GetValue() 
    { 
      return HttpContext.Current.Session[_key]; 
    } 

    public override void SetValue(object value) 
    { 
      HttpContext.Current.Session[_key] = value; 
    } 

    public override void RemoveValue() 
    { 
      HttpContext.Current.Session.Remove(_key); 
    } 
} 

Bạn cũng có thể viết mã tương tự để quản lý vòng đời PerWebRequest.

+1

Theo như tôi biết, phương pháp Remove không bao giờ được gọi bởi khung công tác. Nó ở đó, để sử dụng bởi coder. Tại sao khuôn khổ xác định hợp đồng và không sử dụng một trong các phương pháp trong hợp đồng? Nó khiến tôi phát điên. – Zasz

0

Có lẽ tôi hơn suy nghĩ này nhưng tôi nghĩ rằng bạn nên sử dụng AOP cùng với IoC. Nó thực sự là một cặp đôi đẹp. Về cơ bản những gì tôi sẽ làm là chiếm quyền điều khiển của các lớp mà bạn đang giải quyết, nếu không được gọi là tạo ra một khía cạnh. Sau đó, bạn có thể đưa người dùng vào lớp khi nhập vào hàm tạo, nhưng bất cứ điều gì là giải quyết lớp không rõ ràng phải cung cấp cho người dùng do đó ngăn chặn việc ghép đôi với Unity.

PostSharp là một tuyệt vời AOP framework IMHO.

Bây giờ cuối cùng ứng dụng của bạn sẽ phụ thuộc vào khuôn khổ AOP, nhưng một ứng dụng hoàn toàn tách rời có thể không thực tế tùy thuộc vào môi trường của bạn. Bạn có thể ngạc nhiên rằng sự kết hợp giữa AoP và IoC có ích đến mức nào.

0

Nếu bằng "trình quản lý phiên ASP.NET tùy chỉnh" bạn đang nói về phiên NHibernate hoặc dữ liệu/ObjectContext, có vẻ như những gì bạn cần là IUserRepository được chèn vào bộ khởi tạo hoặc thuộc tính setter mà bạn có thể truy xuất đối tượng User. Việc thực hiện IUserRepository có thể là bất cứ điều gì từ truy cập cơ sở dữ liệu đến một bộ nhớ cache phụ trợ, vv Nếu bạn đang sử dụng .Resolve() trên thùng sơn trực tiếp, bạn đang theo dõi mô hình Service Locator và không đúng cách sử dụng Unity cho tất cả những gì nó có thể cung cấp.

Sau đó bạn có thể sử dụng Ravi's answer để quản lý thời gian tồn tại của kho.

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