Tôi đang thực sự làm việc trên một khuôn khổ mở rộng để sử dụng trên đầu trang của ASP.NET MVC. Khung mở rộng của tôi dựa trên vùng chứa Ioc nổi tiếng: Structuremap.
Trường hợp sử dụng mà tôi đang cố gắng thực hiện rất đơn giản: tạo một ứng dụng cần có một số chức năng cơ bản có thể được mở rộng cho mọi khách hàng (= nhiều người thuê). Chỉ nên có một phiên bản của ứng dụng được lưu trữ nhưng trường hợp này có thể được điều chỉnh cho mọi khách hàng mà không thực hiện bất kỳ thay đổi nào đối với trang web cốt lõi.
Tôi lấy cảm hứng từ bài viết về đa chủ đề được viết bởi Ayende Rahien: http://ayende.com/Blog/archive/2008/08/16/Multi-Tenancy--Approaches-and-Applicability.aspx Một nguồn cảm hứng khác là cuốn sách của Eric Evans về Thiết kế điều khiển tên miền. Khung mở rộng của tôi dựa trên mẫu kho lưu trữ và khái niệm về tập hợp gốc. Để có thể sử dụng khung, ứng dụng lưu trữ sẽ được xây dựng xung quanh các kho lưu trữ và các đối tượng miền. Các bộ điều khiển, kho lưu trữ hoặc các đối tượng miền được liên kết tại thời gian chạy bởi ExtensionFactory.
Trình cắm chỉ đơn giản là một asselmbly chứa Bộ điều khiển hoặc Kho lưu trữ hoặc Đối tượng miền tôn trọng quy ước đặt tên cụ thể. Quy ước đặt tên rất đơn giản, mỗi lớp nên được tiền tố bởi customerID ví dụ: AdventureworksHomeController.
Để mở rộng ứng dụng, bạn sao chép một trình cắm thêm trong thư mục tiện ích mở rộng của ứng dụng. Khi người dùng yêu cầu một trang trong thư mục gốc của khách hàng, ví dụ: http://multitenant-site.com/[customerID]/[controller]/[action] kiểm tra khung nếu có trình cắm cho khách hàng cụ thể đó và khởi tạo các lớp trình cắm tùy chỉnh nếu không nó sẽ tải mặc định một lần. Các lớp tùy chỉnh có thể là Controllers - Repositories hoặc Domain Objects. Cách tiếp cận này cho phép mở rộng một ứng dụng ở tất cả các cấp, từ cơ sở dữ liệu đến giao diện người dùng, thông qua mô hình miền, các kho lưu trữ.
Khi bạn muốn mở rộng một số tính năng hiện có, bạn tạo một trình cắm thêm một assembly có chứa các lớp con của ứng dụng cốt lõi. Khi bạn đã tạo các chức năng hoàn toàn mới, bạn thêm bộ điều khiển mới bên trong trình cắm. Các bộ điều khiển này sẽ được tải bởi khung MVC khi url tương ứng được yêu cầu.Nếu bạn muốn mở rộng giao diện người dùng, bạn có thể tạo chế độ xem mới bên trong thư mục tiện ích mở rộng và tham chiếu chế độ xem bằng trình điều khiển mới hoặc phân lớp .Để sửa đổi hành vi hiện tại, bạn có thể tạo kho lưu trữ mới hoặc đối tượng miền hoặc phân loại phụ thoát. Trách nhiệm khung công tác là xác định đối tượng điều khiển/kho/tên miền nào cần được tải cho một khách hàng cụ thể.
Tôi khuyên bạn nên xem sơ đồ cấu trúc (http://structuremap.sourceforge.net/Default.htm) và đặc biệt là ở các tính năng của Registry DSL http://structuremap.sourceforge.net/RegistryDSL.htm.
Đây là mã tôi sử dụng ở lần khởi động của các ứng dụng để đăng ký tất cả plug-in controllers/kho hoặc các đối tượng miền:
protected void ScanControllersAndRepositoriesFromPath(string path)
{
this.Scan(o =>
{
o.AssembliesFromPath(path);
o.AddAllTypesOf<SaasController>().NameBy(type => type.Name.Replace("Controller", ""));
o.AddAllTypesOf<IRepository>().NameBy(type => type.Name.Replace("Repository", ""));
o.AddAllTypesOf<IDomainFactory>().NameBy(type => type.Name.Replace("DomainFactory", ""));
});
}
Tôi cũng sử dụng một ExtensionFactory kế thừa từ các System.Web.MVC. DefaultControllerFactory. Nhà máy này chịu trách nhiệm tải các đối tượng mở rộng (bộ điều khiển/đăng ký hoặc đối tượng miền). Bạn có thể cắm các nhà máy của riêng bạn bằng cách đăng ký cho họ lúc khởi động trong file Global.asax:
protected void Application_Start()
{
ControllerBuilder.Current.SetControllerFactory(
new ExtensionControllerFactory()
);
}
khuôn khổ này là một trang web mẫu hoạt động đầy đủ có thể được tìm thấy trên: http://code.google.com/p/multimvc/
liên kết của bạn không làm việc tôi đã hy vọng để xem những gì bạn xây dựng, tôi có vấn đề tương tự với dự án của tôi mà tôi muốn thực hiện dự án pluggable vì vậy tôi có thể thêm/xóa chức năng theo yêu cầu. giống như cách mọi người làm trong wordpress. – Alok