2012-04-26 21 views
5

Vấn đềỨng dụng ASP.NET MVC có hỗ trợ plugin và multitenancy với các AppDomain riêng biệt?

Tôi có một ứng dụng ASP.NET MVC 3 với các plug-in /mô-đun kiến ​​trúc và hỗ trợ multi-tenancy. MEF được sử dụng để giải quyết các phụ thuộc và tải các bộ phận có thể cắm được.

Mỗi mô-đun bao gồm bộ điều khiển, chế độ xem và các đối tượng khác (về mặt ngữ nghĩa là một bộ phận). Mô-đun được tải vào người thuê.

Cấu hình đơn giản có thể trông như thế này:

thuê 1:

  • Mô-đun A, phiên bản 1.0 (ModuleA.dll)
  • Module B, phiên bản 1.0 (ModuleB.dll)

Tenant 2:

  • Module B, phiên bản 1.0 (ModuleB.dll)

DLL cho module khác nhau và các phiên bản khác nhau được lưu trữ riêng biệt tại các địa điểm vật lý khác nhau. Và ứng dụng đang chạy trên một AppDomain (mặc định).

Tuy nhiên, nếu chúng tôi muốn thực hiện cấu hình nơi người thuê khác nhau sử dụng các phiên bản mô-đun khác nhau, chúng tôi gặp sự cố khi tải cùng một phiên bản trong phiên bản khác. Điều đó có nghĩa là kịch bản dưới đây không hoạt động đầy đủ vì trong quá trình phân giải các loại từ ModuleB, chúng tôi nhận được ngoại lệ thành phần không khớp (phiên bản 1.0 và 1.5 đã được nạp vào MEF nhưng chỉ có một assembly đã được nạp vào AppDomain bằng trình tải lắp ráp).

thuê 1:

  • Mô-đun A, phiên bản 1.0 (ModuleA.dll)
  • Module B, phiên bản 1.0 (ModuleB.dll)

thuê 2:

  • Mô-đun A, phiên bản 1.5 (ModuleB.dll)

Giải pháp?

Vì vậy, chúng tôi đã đưa ra một giải pháp, là để tải người thuê khác nhau và mô-đun/hội đồng của họ vào các Tên miền riêng biệt. Có nghĩa là từ ví dụ Tenant1 và Tenant2 của chúng ta được nạp vào AppDomain1 và AppDomain2. Trong ASP.NET đường ống MVC chúng tôi nối vào nhà máy điều khiển để chọn miền ứng dụng thích hợp, mà sẽ trông như thế này:

  • Yêu cầu được xử lý theo mặc định AppDomain (một trong đó ứng dụng web bắt đầu)
  • máy điều khiển
    • Đưa Tenant_Id từ yêu cầu và giải quyết điều khiển thích hợp từ thích hợp AppDomain (chúng tôi có Tenant_Id-> Tenant-> mối quan hệ AppDomain)
      • Returns ControllerProxy (mà là một lớp proxy mà thực hiện IController và thừa hưởng MarshalByRefObject để có thể vượt qua tiếp con lăn giữa khác nhau App Domians)
  • Action Invoker
    • hành động đúng được gọi trên đối tượng điều khiển proxy và ngay bây giờ thực hiện diễn ra trong domian ứng dụng tiềm ẩn
    • Và ở đây chúng tôi tình cờ gặp vấn đề bởi vì hành động invoker là không thể vượt qua không serializable RequestContext đến một miền ứng dụng khác (nói cách khác controllerProxy.Execute (RequestContext context) là ném ngoại lệ về serialization)

Câu hỏi (s):

  • Làm thế nào để vượt qua RequestContext (không serializable đối tượng) giữa các lĩnh vực ứng dụng một cách thoải mái?
  • Có thể kết nối vào một bước khác trong đường ống để chuyển hướng thực hiện đến miền ứng dụng cơ bản (trước nhà máy điều khiển không?)
  • Hoặc bất kỳ ý tưởng nào về giải pháp khác cho vấn đề này?

Trả lời

1

Không thể. ASP.NET sẽ trở lại và ám ảnh bạn nếu bạn cố gắng sử dụng các AppDomain khác nhau.

Thay vào đó, hãy sử dụng ủy quyền dựa trên vai trò để kiểm soát quyền truy cập cho các mô-đun khác nhau.

Tôi vừa mới viết một bài báo về cắm hệ thống trong ASP.NET MVC3: http://blog.gauffin.org/2012/05/griffin-mvccontrib-the-plugin-system/

+0

Vấn đề là chúng tôi cần tải các phiên bản plugin khác nhau vào các ứng dụng web khác nhau và tôi hiểu hệ thống plugin bạn mô tả không xử lý các tình huống như vậy. Hoặc là? – untoldex

+0

Không thể. Bạn không thể sử dụng các phiên bản lắp ráp khác nhau trong cùng một miền ứng dụng và ASP.NET quản lý AppDomain. Bạn sẽ hối tiếc nếu bạn cố gắng sử dụng các miền ứng dụng khác. – jgauffin

+0

Thực ra bạn có thể sử dụng các phiên bản lắp ráp khác nhau trong cùng một miền ứng dụng - bằng cách tải các assembly không có ngữ cảnh - từ mảng byte (Assembly.Load (byte [])). Tôi hiện đang cố gắng để có được nó làm việc nhưng có vấn đề với MEF ... – untoldex

0

này không trực tiếp trả lời câu hỏi của bạn về nhiều lĩnh vực ứng dụng trong ASP.NET MVC. Tuy nhiên, liên quan đến các tùy chọn khác, bạn có thể muốn kiểm tra Khung ứng dụng được quản lý (a.k.a. System.Addin). Nó là một phần của .NET Framework, và tương tự như MEF ở chỗ nó hỗ trợ nạp các mô đun động. Tuy nhiên, nó đã được xây dựng trong chức năng để tách các mô-đun trên các miền ứng dụng. Nó có thể phù hợp hơn với nhu cầu của bạn. Tôi không chắc chắn như thế nào nó phù hợp với ASP.NET MVC, mặc dù.

Điều này document on MSDN sẽ bắt đầu với MAF.

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