2010-08-04 35 views
23

Chúng tôi có một ứng dụng web enterpise bao gồm 4 thành phần được biên dịch (DLL). Hơn một năm trước, chúng tôi đã bắt đầu triển khai các thành phần chi tiết hơn trong nỗ lực tách biệt chức năng, giảm khớp nối và giảm nguy cơ biên dịch lại và triển khai các khối mã lớn. Trong khi không ai cho rằng cách tiếp cận này đã cho chúng ta MUCH cải thiện tính linh hoạt và tốc độ cho thị trường khi thêm chức năng mới và vá lỗi, các ứng dụng hiện nay bao gồm gần 40 dll. Chúng tôi có một quy ước đặt tên hoạt động tốt để xác định các thành phần của chúng tôi.Các ứng dụng có nhiều DLL là một điều xấu?

Câu hỏi của tôi là: Có bất kỳ tác vụ phụ nào (Hiệu suất, bảo trì, v.v ...) để có một ứng dụng có nhiều dll không?

Chỉnh sửa: Chúng tôi đang khám phá các tùy chọn mã refactoring thành các thành phần lớn hơn mà tôi nghĩ có thể là một hồi quy của các loại ...

Trả lời

14

Câu hỏi của tôi là: Có bất kỳ xuống phía (hiệu suất, bảo trì, vv ...) để có một ứng dụng với nhiều dlls?

Nhược điểm với nhiều tệp DLL? Không
Một nhược điểm với quá nhiều tệp DLL? Chắc chắn rồi.

Vậy số lượng quá nhiều?

Hội đồng là phương tiện tổ chức, như không gian tên và các lớp học. Không gian tên xác định ranh giới logic, lắp ráp ranh giới vật lý.

Bạn nên cố gắng giữ các hội đồng mạch lạc và xem chúng dưới dạng mô-đun hệ thống.

Và có, sẽ có một vấn đề hiệu suất (nhỏ) nếu bạn có hàng trăm người trong số họ.Nhưng với 40, tôi không thấy vấn đề gì.

7

Bảo trì - không, hiệu suất - vâng. Các hội đồng nhiều hơn cần phải được tải chậm hơn ứng dụng của bạn sẽ bắt đầu. Đối với mỗi hội đồng cần được tải vào AppDomain, trình tải cần thực hiện một loạt các xác minh.

+0

Người dùng ban đầu sẽ bị ảnh hưởng đến hiệu suất, nhưng người dùng tiếp theo sẽ không có cùng trải nghiệm ... đúng không? – Achilles

+0

@Achilles, đúng, một khi đã được JIT, nó sẽ ổn. –

+0

Cũng có thể (tùy thuộc vào kiến ​​trúc ứng dụng của bạn) để tải động các cụm này "theo yêu cầu" (ví dụ như chức năng được truy cập, nếu có!) Để cho phép ứng dụng tải ban đầu nhanh hơn và cung cấp cho người dùng * tăng hiệu suất. – CraigTP

5

Các loại vấn đề tồi tệ hơn với nhiều DLL là:

  • lần tích xây dựng: trình biên dịch chạy một lần cho mỗi DLL và DLL phải được sao chép đến và đi từ thư mục đầu ra
  • Thời gian tải: mỗi tệp DLL phải được tải riêng bởi Windows, mặc dù các tệp DLL được tải theo yêu cầu, vì vậy bạn thường sẽ phải trả chi phí cho các phần bạn sử dụng
  • Rebasing: càng nhiều DLL bạn e, cơ hội lớn hơn mà hai người sẽ va chạm trong bộ nhớ ảo. Điều này không gây ra vấn đề, bởi vì Windows có thể rebase một trong số chúng, nhưng quá trình rebasing mất thời gian, và Windows phải load bất kỳ trang DLL bị ảnh hưởng từ đĩa trước. Việc rebasing không ảnh hưởng nhiều đến các DLL được quản lý nhiều.
  • Visual Studio overhead: một DLL = một dự án = nhiều việc cho IDE

Lời khuyên tôi làm theo là sử dụng DLL để tổ chức triển khai của bạn, và không gian tên tổ chức mã của bạn. Nếu bạn thấy rằng bạn luôn phát hành một tập hợp các tệp DLL nhất định, bạn cũng có thể hợp nhất chúng.

+1

Bạn có thể giảm thời gian xây dựng bằng cách tắt tính năng 'sao chép cục bộ' của một dự án. Điều này có thể làm giảm nghiêm trọng thời gian xây dựng. Pattrick Smacchia đã viết một bài báo trong những gì ông giải thích làm thế nào để làm điều này: http://codebetter.com/blogs/patricksmacchia/archive/2009/01/11/lessons-learned-from-the-nunit-code-base.aspx. – Steven

+0

Hầu hết các kỹ thuật lắp ráp/không gian tên mà tôi theo dõi tôi đã học được từ Patrick –

12

Tách các miền chức năng độc lập thành các tệp DLL riêng lẻ thường là điều tốt. Nó giúp giới thiệu tiềm năng tái sử dụng và giúp giảm thiểu sự giới thiệu của sự ghép nối không phù hợp giữa việc triển khai nội bộ của các lớp.

Tuy nhiên, có nhược điểm để giới thiệu nhiều hội như một phần của hệ thống:

  1. Phải mất thời gian để tải, xác minh, và nhiều hội JIT. Điều này hiếm khi là một vấn đề, tuy nhiên - và nói chung không nên là mối quan tâm chính của bạn trong việc quyết định cách phân vùng chức năng của một ứng dụng.
  2. Có thể không khôn ngoan để cập nhật ứng dụng bằng cách triển khai các thay đổi trong một hội đồng duy nhất. Thường chia ứng dụng thành các tệp DLL riêng biệt tạo ra ấn tượng rằng có thể sửa chữa hoặc tăng cường nó bằng cách thay thế một số cụm của nó. Mặc dù chắc chắn nó có thể giới thiệu các lỗi nhỏ nếu có những thay đổi trong các hiệu ứng phụ hoặc các hành vi không có giấy tờ của các lớp và các phương pháp trong các hội đồng đó.
  3. Có thể khó hiểu một hệ thống được chia thành quá nhiều hội đồng. Các công cụ như ReSharper và CodeRush có một số hạn chế khi phân tích mã được chia cho nhiều cụm.
  4. Điều này có thể khuyến khích các nhà phát triển tạo nhiều loại công khai hơn mức độ cần thiết. Vì chỉ có các loại công cộng mới có thể được tiêu thụ và kế thừa bởi các hội đồng khác, một dự án đa lắp ráp có thể dẫn đến nhiều loại công khai hơn so với mong muốn.
+0

Cần lưu ý rằng bạn có thể giảm thiểu số 4 bằng cách tận dụng thuộc tính cấp hội đồng InternalsVisibleTo. Các hội đồng có thể có tham chiếu đến từng công cụ khác, nhưng những thứ bên ngoài các hội đồng đó không nên, bạn có thể sử dụng nội bộ và sử dụng thuộc tính để làm cho nó hiển thị với hội đồng khác. – RationalGeek

+0

@jkohlhepp: Đúng vậy. Bạn cũng có thể cung cấp cho một nhóm các hội đồng tên mạnh để giới hạn những hội đồng khác có thể thực sự truy cập vào những loại đó. – LBushkin

3

Đừng quên khoảng ILMerge. Nó hoạt động khá tốt nếu bạn muốn nhiều DLL để phát triển (các dự án khác nhau) nhưng một EXE để triển khai (tải nhanh hơn, dễ triển khai hơn).

Nhược điểm của ILMerge là nó sẽ thất bại trong một số trường hợp tải động, ví dụ: tạo một thể hiện của một loại theo tên (chuỗi). Vì vậy, ILMerge có thể hoặc có thể không khả thi, tùy thuộc vào nhà cung cấp IoC của bạn.

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