2010-03-25 15 views
5

Tôi sẽ bắt đầu bằng cách nói thiết lập dự án của tôi:Sử dụng ASP.NET MVC, LINQ to SQL, và StructureMap gây DataContext để dữ liệu bộ nhớ cache

  • ASP.NET MVC 1.0
  • StructureMap 2.6.1
  • VB

tôi đã tạo ra một lớp bootstrapper đưa ra ở đây:

Imports StructureMap 
Imports DCS.Data 
Imports DCS.Services 

Public Class BootStrapper 

    Public Shared Sub ConfigureStructureMap() 

     ObjectFactory.Initialize(AddressOf StructureMapRegistry) 

    End Sub 

    Private Shared Sub StructureMapRegistry(ByVal x As IInitializationExpression) 

     x.AddRegistry(New MainRegistry()) 
     x.AddRegistry(New DataRegistry()) 
     x.AddRegistry(New ServiceRegistry()) 
     x.Scan(AddressOf StructureMapScanner) 

    End Sub 

    Private Shared Sub StructureMapScanner(ByVal scanner As StructureMap.Graph.IAssemblyScanner) 

     scanner.Assembly("DCS") 
     scanner.Assembly("DCS.Data") 
     scanner.Assembly("DCS.Services") 
     scanner.WithDefaultConventions() 

    End Sub 

End Class 

tôi đã tạo ra một nhà máy điều khiển đưa ra ở đây:

Imports System.Web.Mvc 
Imports StructureMap 

Public Class StructureMapControllerFactory 
    Inherits DefaultControllerFactory 

    Protected Overrides Function GetControllerInstance(ByVal controllerType As System.Type) As System.Web.Mvc.IController 

     Return ObjectFactory.GetInstance(controllerType) 

    End Function 

End Class 

Tôi đã sửa đổi các Global.asax.vb như ở đây:

... 
    Sub Application_Start() 

     RegisterRoutes(RouteTable.Routes) 

     'StructureMap 
     BootStrapper.ConfigureStructureMap() 
     ControllerBuilder.Current.SetControllerFactory(New StructureMapControllerFactory()) 

    End Sub 
... 

Tôi đã thêm một tập tin cấu Map registry để mỗi dự án của tôi: DCS, DCS.Data và DCS.Services. Dưới đây là các registry DCS.Data:

Imports StructureMap.Configuration.DSL 

Public Class DataRegistry 
    Inherits Registry 

    Public Sub New() 

     'Data Connections. 
     [For](Of DCSDataContext)() _ 
      .HybridHttpOrThreadLocalScoped _ 
      .Use(New DCSDataContext()) 

     'Repositories. 
     [For](Of IShiftRepository)() _ 
      .Use(Of ShiftRepository)() 

     [For](Of IMachineRepository)() _ 
      .Use(Of MachineRepository)() 

     [For](Of IShiftSummaryRepository)() _ 
      .Use(Of ShiftSummaryRepository)() 

     [For](Of IOperatorRepository)() _ 
      .Use(Of OperatorRepository)() 

     [For](Of IShiftSummaryJobRepository)() _ 
      .Use(Of ShiftSummaryJobRepository)() 

    End Sub 

End Class 

Tất cả mọi thứ hoạt động tốt như xa như tải dependecies, nhưng tôi đang gặp vấn đề với các lớp DCSDataContext được genereated bởi Lớp Linq2SQL.

Tôi có biểu mẫu đăng lên trang chi tiết (/ Tóm tắt/Chi tiết), tải trong một số dữ liệu từ SQL. Sau đó, tôi có một nút mở ra một hộp thoại trong JQuery, trong đó populates hộp thoại từ một yêu cầu đến (/ Operator/Modify). Trên hộp thoại, biểu mẫu có hộp tổ hợp và nút OK cho phép người dùng thay đổi tên của nhà điều hành. Khi nhấp vào OK, biểu mẫu được đăng lên (/ Operator/Modify) và được gửi qua các lớp dịch vụ và kho lưu trữ của chương trình của tôi và cập nhật bản ghi trong cơ sở dữ liệu. Sau đó, RedirectToAction được gọi để gửi người dùng trở lại trang chi tiết (/ Summary/Details) trong đó có một cuộc gọi để kéo dữ liệu từ SQL một lần nữa, cập nhật khung nhìn chi tiết.

Mọi thứ hoạt động tốt, ngoại trừ chế độ xem chi tiết không hiển thị toán tử mới đã được chọn. Tôi có thể bước qua mã và xem lớp DCSDataContext đang được truy cập để cập nhật toán tử (thực sự thay đổi bản ghi cơ sở dữ liệu), nhưng khi DCSDataContext được truy cập để tải lại các đối tượng chi tiết, nó kéo vào giá trị cũ. Tôi đoán rằng StructureMap không chỉ gây ra lớp DCSDataContext mà còn là dữ liệu được lưu trữ?

Tôi cũng đã thử thêm dòng sau vào Global.asax, nhưng nó chỉ kết thúc lên đâm chương trình nói với tôi những DCSDataContext đã được xử lý ...

Private Sub MvcApplication_EndRequest(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.EndRequest 

    StructureMap.ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects() 

End Sub 

Ai đó có thể xin vui lòng giúp đỡ?

Trả lời

5

Got phản ứng này lại từ Jeremy Miller vào nhóm StructureMap google:

Dễ tiền, bạn đang tạo ra một thể hiện của lớp DataContext đối tượng -yourself- trong việc đăng ký, mà trên thực tế làm cho rằng một singleton suốt hệ sinh thái StructureMap.

Mã này:

'Data Connections. 
[For](Of DCSDataContext)() _ 
    .HybridHttpOrThreadLocalScoped _ 
    .Use(New DCSDataContext()) 

nhu cầu để xác định DataContext sử dụng thực hiện -deferred- thay vì sử dụng được xây dựng trước "New DCSDataContext()"

Nếu bạn đã trong C# (vì tôi không biết cú pháp VB), bạn sẽ làm:

For<DCSDataContext>().HybridHttpOrThreadLocalScoped().Use(() => new DCSDataContext()); 

Tôi chạy này thông qua một C# để VB chuyển đổi và nó đã cho tôi điều này:

[For](Of DCSDataContext)() _ 
    .HybridHttpOrThreadLocalScoped _ 
    .Use(Function() New DCSDataContext()) 

Những tác phẩm tuyệt vời!

+0

Làm cách nào để đưa tham số vào() => new DCSDataContext (tham số), tôi muốn tạo tham số là tự động có dây, tôi không muốn tạo và cung cấp thủ công –

+0

@Sessiz Satt: Tôi đã thực hiện việc này bằng chuỗi kết nối bất động sản. Tôi đã kéo thuộc tính chuỗi kết nối của mình từ tệp Web.Config và chuyển nó như thế này ...() => new DCSDataContext (ConfigurationManager.AppSettings ["Key"]) – Dragn1821

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