2010-07-16 17 views
5

Tôi có một vấn đề rất khó khăn để giải quyết, và tôi nghĩ và tìm kiếm rất nhiều và đi xuống một kết luận mà tôi sẽ đề cập đến. vấn đề là tôi có một khách hàng muốn tạo một trang web dựa trên chức năng chung, vì vậy chúng tôi gọi nó là Mô-đun, vì vậy điều tôi nghĩ là sử dụng Khu vực di động của MVC Contrib, đó là những ý tưởng tuyệt vời để cắm Mô-đun, nhưng tôi có một vấn đề lớn, chúng ta hãy nói rằng tôi đã tạo một mô-đun Blog sẽ được triển khai trong một trang web mới mà anh ta muốn, hiện tại một số người dùng có yêu cầu duy nhất như một trong số họ cần thêm Thư viện ảnh cho từng bài viết hoặc Danh sách tham chiếu trong mỗi bài viết . điều này sẽ dễ dàng trong tình huống bình thường khi bạn có một trang web để làm việc, vì vậy tất cả những gì bạn phải làm làMô-đun phức tạp Dựa Tạo bản ghi mới trong DB với ASP.NET MVC 2

  • thêm một bảng bộ sưu tập mới với khóa ngoài vào bảng Blog.
  • tạo lại mã LINq2SQl và cập nhật Mô hình.
  • thêm các phần tử biểu mẫu mới vào Tạo, Chỉnh sửa, Xóa chế độ xem.
  • thêm logic trong bộ điều khiển.

nhưng trong hoàn cảnh của tôi nó là phức tạp và thời gian cồng kềnh vì 2 lý do

  • nếu các chức năng mới là mát mẻ và khách hàng quyết định thực hiện nó trong tất cả các trang web, sau đó tôi phải lặp lại hoạt động cho mỗi trang web.
  • nếu các chức năng là duy nhất nó sẽ tạo ra sự mâu thuẫn đối với tôi trong tương lai

đó là lý do tại sao như bước đầu tiên để giải quyết vấn đề tôi đã sử dụng khu vực di động để tạo Addons cho mỗi mô-đun, bây giờ điều này chắc chắn sẽ giảm bớt công việc của tôi bằng cách kéo 1 DLL cho mỗi mô-đun mới hoặc Addon, nhưng tôi có một vấn đề nhỏ ở đây, mà

  • vì module mới hoặc Addin là một DLL , làm thế nào tôi có thể tạo ra một chức năng như vậy trong bảng quản trị của tôi để cài đặt Addon mới hoặc tìm bất kỳ mới thêm Module/Addon kéo DLL mới đến ứng dụng chính
  • là gì tốt nhất thực hành để tạo ra một cài đặt thủ tục bên trong khu vực di động, như Update DB, đường mới, vv ..

Bây giờ vấn đề lớn nhất dành riêng cho Module Addon :) chúng ta hãy lấy lại Thư viện bài viết Addon, nếu tôi làm theo logic tôi đã đề cập ở trên. để tạo một chức năng trong Mã Mô-đun để lặp qua tất cả các Cài đặt Addons và liệt kê chúng trong Chế độ xem CRUD, nhưng vì tôi đã tách Addon và không muốn cập nhật Mã Mô-đun Chính theo cách thủ công vì các Lý do Ở trên sẽ không có cách nào cho thực hiện các hoạt động CRUD cho Addons mới trong Sync với mô-đun chính vì không có quan hệ khóa ngoại, vì tôi đã nói ở trên có thể là tùy chọn, vì vậy tôi nghĩ về giải pháp sau mà tôi hy vọng sẽ có một giải pháp tốt hơn

Đầu tiên trong quá trình cài đặt Tôi sẽ tạo một Bảng cho Gallery Addon, nhưng thay vì tạo ra một quan hệ Key ngoài, tôi sẽ tạo ra một Foreign Key bằng tay để tạo một ID duy nhất trong Main Module Controller khi tạo bản ghi bằng cách sử dụng đoạn mã sau rồi lưu nó trong ViewData và chỉ cần vượt qua nó để điều khiển Addon khi tôi tạo mới ghi,

private string GenerateId() 
{ 
    long i = 1; 
    foreach (byte b in Guid.NewGuid().ToByteArray()) 
    { 
    i *= ((int)b + 1); 
    } 
    return string.Format("{0:x}", i - DateTime.Now.Ticks); 
} 
ViewData["FK"] = GenerateId(); 

nhưng đây là Mối quan tâm của tôi

  • là cách này khả thi hoặc chỉ đơn giản ngốc .
  • là kỹ thuật này sẽ tạo ra một khóa thực sự độc đáo.

Tôi vô cùng xin lỗi nếu câu hỏi của tôi là khập khiễng, nhưng đây là nơi tốt nhất để hỏi và tôi nghĩ nhiều người sẽ muốn có một chức năng như vậy và hy vọng ai đó sẽ trả lời tôi

+2

Nó không phải là một câu hỏi què chút nào, nhưng nó * là * một câu hỏi thiết kế, đòi hỏi một chút suy nghĩ. Tôi không nghĩ rằng thiết kế cơ sở dữ liệu của bạn nên bao giờ yêu cầu bạn tạo ra ID của riêng bạn, mặc dù.Bản năng của tôi là bạn cần một bảng chứa tất cả thông tin plugin của bạn (nếu đó là những gì bạn đang làm), với một cột bổ sung để phân biệt các plugin với nhau. Điều này sẽ cho phép bạn sử dụng cùng một lược đồ LINQ to SQL cho tất cả các plugin. Nếu có thông tin duy nhất cho một plugin cụ thể, bạn có thể tạo một lược đồ LINQ to SQL riêng biệt cho thông tin duy nhất của plugin đó. –

+1

Giản đồ LINQ to SQL riêng biệt có thể hoạt động với plugin, do đó bạn không bắt buộc phải cập nhật lược đồ LINQ to SQL chính mỗi khi bạn thêm một plugin với thông tin duy nhất. Đây chỉ là một trong nhiều cách mà vấn đề có thể được giải quyết. –

+0

thanks guys nhưng, bạn có thể cho tôi biết chính xác những gì tôi nên bao gồm trong Schema plugin, chỉ có các Plugin Plugin? một vấn đề khác vẫn còn tồn tại là làm thế nào tôi có thể kết nối các hồ sơ mới được chèn vào với Plug ins, là nó như tôi đã đề cập hoặc có cách tốt hơn? – DevMania

Trả lời

2

Tôi nghĩ rằng đó là một câu hỏi tuyệt vời. một thời gian trước, tôi bắt đầu làm việc trên một dự án CMS sử dụng MVC1, nơi tôi muốn hỗ trợ các plugin. Tôi đã có nó làm việc để các admin có thể thả một hội đồng plugin mới vào thư mục bin, và bắt đầu ứng dụng tiếp theo, nó sẽ quét tất cả các hội đồng cho IPlugin (hoặc bất cứ điều gì) và tải chúng. Tôi đã nhúng các khung nhìn một phần vào trong hội đồng plugin nên nó hoàn toàn khép kín. mỗi plugin được cung cấp một mã định danh duy nhất khi nó được đặt trên một trang và trình điều khiển của plugin biết cách sử dụng ID đó để truy vấn bảng (kho lưu trữ) của chính nó cho dữ liệu của nó. ứng dụng chính không biết gì về lược đồ của plugin.

sự khác biệt duy nhất ở đây là có vẻ như bạn sẽ có nhiều trang web chạy trên cùng một cơ sở dữ liệu và bạn cần phân biệt trường hợp plugin nào bạn cần cho mỗi trang web. Tôi giả định một nơi nào đó bạn có một chìa khóa cho biết trang web đó là gì, có thể được sử dụng thông qua khóa ngoại để chỉ chọn các plugin cho trang web đó cho trang mà người dùng đang truy cập.

Tôi không chắc đây có phải là câu trả lời hay không, tôi chỉ đang nghĩ lớn thôi. hy vọng nó sẽ giúp thảo luận một chút.

EDIT: Để tự động tải các plugin, tôi đã sử dụng khả năng của NInject để quét các hội đồng cho IModules. IPlugin của tôi kế thừa từ Ninject.Modules.INinjectModule và tất cả plugin đều triển khai giao diện IPlugin. Sau đó, khi khởi động ứng dụng, tôi có các dòng sau:

kernel.Load("*.Plugin.dll"); 

nơi hạt nhân là một Ninject.IKernel và dòng sẽ quét bất kỳ lắp ráp phù hợp với mô hình mà tập tin, vì vậy tôi có thể thả trong một hội đồng như Weather.Plugin.dll .

+0

cảm ơn người đàn ông đã nghĩ ra tải, thực sự những gì tôi muốn làm giống như bạn, các trang web không chạy trên một DB trung tâm, điều tôi muốn nói là lược đồ DB chính sẽ được lặp lại trên mỗi trang web, vấn đề của tôi là tôi muốn những Plugins không có mối quan hệ khóa ngoài mạnh mẽ để lấy ID của bài viết mới được chèn vào Blog chính, vì vậy tôi có thể kết nối chúng lại với nhau khi tôi truy vấn, và tôi dường như không thể tìm ra được bạn cho tôi biết làm thế nào bạn tìm kiếm những hội đồng mới, tôi có nghĩa là bất kỳ mã nhỏ sẽ giúp :) – DevMania

+1

cập nhật câu trả lời của tôi w/mã quét. Tôi không chắc chắn những gì bạn có nghĩa là "kết nối chúng với nhau khi tôi truy vấn". bạn có thể cho tôi biết bạn đang cố gắng làm gì không? –

+0

keeol man, ý tôi là khi bạn đọc câu hỏi ở trên, tôi đã đề cập rằng tôi sẽ có một Mô-đun Blog cơ sở và có thể một Addon (Plugin) mới sẽ cho phép bạn thêm Hình ảnh vào bài viết, Bây giờ vấn đề của tôi như tôi đã đề cập là làm thế nào khi tôi chèn một Điều mới, tôi sẽ có thể nhận được nó id và làm cho nó một khóa nước ngoài trong bộ sưu tập Plugin vì vậy khi tôi muốn hiển thị bài viết, tôi có thể tham gia truy vấn Bảng Điều + bảng Plugin Gallery, về cơ bản cuộc đấu tranh của tôi là khi tôi nhấn save, tôi muốn có một cơ chế sẽ lấy ID bài viết mới và chuyển nó tới ví dụ để render action – DevMania