2012-04-30 62 views
6

Tôi hiện đang làm việc trên trang web thương mại điện tử và có một tính năng mà tôi không chắc chắn về cách triển khai. Hầu hết thời gian bạn chỉ cần thêm (các) sản phẩm vào giỏ hàng của bạn và mua chúng, đó có lẽ là quy trình làm việc đơn giản nhất. Những gì tôi yêu cầu là một chút khác nhau, nếu có một giới hạn thời gian cho một sản phẩm để mua? Ý tôi là một số trang web cung cấp cho bạn giới hạn thời gian chính xác để mua sản phẩm (như Trình quản lý bóng đá), trong các trang web đó bạn không thể giữ sản phẩm mãi mãi, có giới hạn 15 phút cho nó và nếu bạn không mua trong khoảng thời gian đó được phát hành từ giỏ hàng của bạn. (và có lẽ ai đó sẽ nhảy lên)Làm thế nào để thực hiện các công việc nền trong trang ASP.NET MVC 3?

Bây giờ, với tư cách là lập trình viên ASP.NET MVC, tôi muốn thực hiện tính năng này nhưng như tôi đã nói, tôi không biết phải làm thế nào. Tôi nghĩ rằng khi tôi thêm mục vào giỏ hàng tôi cần phải giữ thời gian (một cái gì đó như ItemAddedAt) và tôi cần phải phát hành mục đó trong x phút vì vậy một cái gì đó cần phải chạy x phút sau đó để phát hành sản phẩm đó. Trên toàn cầu suy nghĩ, tôi nghĩ rằng tôi cần một dịch vụ, khi tôi thêm một mục, tôi cũng cần phải đăng ký nó với dịch vụ và dịch vụ này chạy một bộ đếm thời gian/công việc trong nền. Những gì tôi không biết/không có kinh nghiệm là một phần này, làm thế nào để làm điều đó trong một dự án ASP.NET MVC, là có một dự án mẫu, bài viết, thư viện hoặc một cái gì đó như thế?

Tất nhiên tôi không biết nếu logic của tôi là đúng cho vấn đề này, tôi cần một số hướng dẫn, nếu có thể một số mã nguồn để làm việc trên.

Trả lời

4

AFAIK không có cách tiêu chuẩn để khai báo/nhiệm vụ chương trình trong dự án MVC. Cách được khuyến nghị để thực hiện những gì bạn muốn là tạo một dự án Ứng dụng Console mới trong giải pháp của bạn và sử dụng Windows Task Scheduler để thực thi mọi phút X, phát hành bất kỳ sản phẩm nào đã hơn X phút trong bất kỳ giỏ hàng nào. Để làm việc này, bạn sẽ cần tham chiếu dự án MVC của bạn từ dự án mới (để truy cập vào tất cả các mô hình) hoặc thậm chí tốt hơn, tạo dự án Thư viện lớp, di chuyển các lớp Mô hình/cơ sở dữ liệu ở đó, và tham khảo nó từ các dự án MVC và Console.


Tất cả những gì được nói, thực sự có một "hack" nhỏ có thể được sử dụng để nhận các tác vụ được lập trình trong dự án MVC. Bạn có thể sử dụng mã sau:

HttpContext.Current.Cache.Add("Task", "1", null, 
      DateTime.MaxValue, TimeSpan.FromMinutes(5), 
      CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts)); 

Dòng đó, có thể được gọi là, từ Global.asax, sẽ thêm mục "Tác vụ" vào bộ nhớ cache. Giá trị được lưu trữ ("1") không quan trọng, điều quan trọng là mục nhập bộ nhớ cache hết hạn sau năm phút và khi hết hạn, gọi phương thức "CheckCarts" (được định nghĩa trong Global.asax hoặc trong lớp bạn đã thực hiện) mã này).

public void CheckCarts(string key, object value, CacheItemRemovedReason reason) { 
    // Insert your code here to check for expired carts 
    (...) 

    // We add the entry again to the cache, so that this method will be called again in 5 minutes. 
    HttpContext.Current.Cache.Add("Task", "1", null, 
      DateTime.MaxValue, TimeSpan.FromMinutes(5), 
      CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts)); 
} 

Khi bộ nhớ cache hết hạn, phương pháp CheckCarts được gọi, mã của bạn làm bất cứ điều gì nó đã làm, và cuối cùng thì thêm nó vào Cache lần nữa, để được gọi thêm 5 phút.

+0

Trước hết, cảm ơn lời giải thích chi tiết ^^ Tôi nghĩ tôi sẽ không thích Windows Task Scheduler vì tôi hiểu, nếu tôi sử dụng Scheduler theo cách đó thì tôi cần phải chạy dịch vụ đó với thời gian rất ngắn hoặc sẽ có khoảng cách lớn giữa thời gian hết hạn và thời gian chạy theo lịch trình tiếp theo. IMHO giải pháp thứ hai của bạn thú vị hơn vì nó cung cấp cho bạn một kích hoạt chính xác và có vẻ như nó có thể dễ dàng thực hiện nhưng có một câu hỏi trong đầu, CacheItemRemovedCallback có đủ đáng tin cậy để sử dụng trong các loại giải pháp này không? –

+0

loại triển khai đệ quy có thể hoạt động tốt, nhưng tôi ngay lập tức bắt đầu lo lắng về kích thước ngăn xếp cuộc gọi trong trường hợp này –

+0

@ArtemNikolov Chúng tôi đã sử dụng mã đó cho cùng một lý do chính xác (nó hiện đang làm việc trong một thương mại điện tử, giải phóng cổ phiếu), và nó đã được chạy trong khoảng 4 năm, vì vậy tôi sẽ đoán như vậy :) – salgiza

3

Kịch bản này chỉ phát ra tín hiệuR. Nó sẽ cho phép bạn làm những gì bạn đang yêu cầu một cách đơn giản.

Nếu các mục trong giỏ hàng của bạn có ngày hết hạn, bạn có thể có cuộc thăm dò ý kiến ​​xem nếu có bất kỳ mục nào hết hạn. Nếu họ có bạn có thể chạy mã loại bỏ cho mục đó và cập nhật ui của bạn.

+1

Tôi đồng ý. Việc xóa không quan trọng cho đến khi bạn cố gắng xem giỏ hàng của mình. Vậy tại sao chạy quá trình nền này? Chỉ cần kiểm tra giỏ hàng hết hạn trước khi hiển thị nó. Điều này cũng sẽ giúp bạn tiết kiệm công việc của những chiếc xe bị bỏ rơi hết hạn. Và sẽ tiết kiệm cho bạn phải theo dõi một tập hợp các công việc hàng loạt để đảm bảo họ đang chạy. –

+0

@spaceman: Tôi chắc chắn sẽ nghiên cứu về SignalR, một thư viện thời gian thực như vậy có thể làm tốt ở đây và bạn có thể thực hiện một số thủ thuật UX đẹp mắt. –

+0

@Brian: Tôi nghĩ có một chút hiểu lầm về việc xóa này, đây không phải về giỏ hàng của người mua, đây là về cổ phiếu của sản phẩm đó. Sau khi hết hạn, bạn cần phải phát hành sản phẩm đó để một số người khác có thể mua sản phẩm đó, cho đến thời điểm đó bạn cần hiển thị cho họ nút mua bị vô hiệu vì mục vẫn được đặt trước. Tất nhiên đối với mọi yêu cầu bạn cần phải kiểm tra cổ phiếu của bạn anyway nhưng bây giờ dịch vụ quản lý hàng tồn kho của bạn sẽ cần phải kiểm tra hết hạn của mục dự trữ là tốt. Thay vào đó tôi muốn rằng tín hiệu sản phẩm hết hạn để tôi có thể giảm nội dung nhắn tin giữa các thành phần. –

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