Tôi đang trong quá trình tạo bản phát hành nhỏ mới của số toy project của tôi. Dự án này được phát hành trên NuGet và tương thích với .NET 4.0 trở lên. Một số tính năng mới mà tôi giới thiệu yêu cầu .NET 4.5 (người dùng có thể giải quyết IReadOnlyCollection<T>
và IReadOnlyList<T>
, cả hai giao diện được giới thiệu trong .NET 4.5), nhưng tôi cần giữ cho dự án tương thích với .NET 4.0, vì không tất cả các nhà phát triển có thể dễ dàng chuyển sang khung công tác .NET mới nhất.Cách bật tính tương thích về phía trước trên thư viện .NET có thể tái sử dụng?
Vì vậy, vấn đề tôi đang gặp phải là cách giải quyết vấn đề 'tương thích về phía trước' này. Có hai giải pháp mà tôi đã nghĩ đến, nhưng cả hai đều không hấp dẫn lắm, vì vậy hy vọng mọi người có thể cho tôi một số ý tưởng hoặc hướng dẫn tại đây.
Dưới đây là hai giải pháp tôi đã đưa ra:
Giải pháp 1: Sử dụng #if
chỉ thị biên dịch và xây dựng một DLL mỗi phiên bản .NET framework và xuất xưởng những phiên bản sử dụng các gói NuGet và tải về tại khu vực dự án. Mặt khác của phương pháp này là khi các nhà phát triển cập nhật dự án Visual Studio của họ từ .NET 4.0 lên .NET 4.5, họ không tự động lấy phiên bản .NET 4.5 (với .NET 4.5 tính năng cụ thể). Điều này vi phạm các Principle of least astonishment và sẽ để lại các nhà phát triển ngạc nhiên vì sao tính năng này không hoạt động, khi họ thử sử dụng tính năng này một vài tháng sau đó.
Giải pháp 2: Sử dụng một DLL duy nhất và loại phát ra khi đang thực hiện cả hai giao diện mới khi chúng tồn tại trong miền ứng dụng hiện tại. Điều này cho phép vận chuyển một DLL duy nhất cho người dùng và cho phép các tính năng khả dụng khi nhà phát triển chuyển đổi các phiên bản .NET framework trong dự án của họ. Điều này sẽ làm cho mọi thứ 'hoạt động'. Đây là hướng tôi đang hướng tới btw.
Vì tôi cần trả về loại cần triển khai giao diện, nên nhược điểm là loại đó phải được tạo khi chạy bằng cách sử dụng Reflection.Emit, ModuleBuilder, TypeBuilder và các loại tương tự. Đây là sự hỗn loạn khó chịu nghiêm trọng. Nhưng bên cạnh đó, vì kiểu này phải được tạo ra trong một assembly mới (ẩn danh), tôi phải làm cho một số kiểu nội bộ công khai (một kiểu nó cần phải kế thừa từ và một giao diện nó cần thực hiện). Làm cho các loại nội bộ đó gây ô nhiễm cho API của dự án và sẽ không cho phép tôi thực hiện các thay đổi đối với các loại đó.
Tôi tin rằng đây là những lựa chọn của tôi, nhưng tôi có thể thiếu điều gì đó hiển nhiên. Vì vậy, câu hỏi của tôi là, tôi thiếu một khả năng? Có cách nào để phá vỡ các vấn đề cho giải pháp 1 hoặc nó sẽ là tốt hơn để đi với gốc hardcore của thời gian chạy loại phát ra?
json.net sử dụng giải pháp 1. –
Tôi không nghĩ tùy chọn đầu tiên sẽ bay khi đối mặt với nguyên tắc: tại sao tôi mong đợi tham chiếu của bên thứ ba bị cưỡng hiếp như vậy? Tôi sẽ ngạc nhiên nếu họ đã làm! –
Không chắc chắn nếu nó thực sự phù hợp ở đây hoặc nếu nó thậm chí có liên quan ở đây nhưng không chuyển hướng lắp ráp tấn công một số hợp âm? –