7

Chúng tôi hiện đang viết một gói nuget hoạt động như một cổng dịch vụ. Trách nhiệm của nó là kết thúc cuộc gọi đến một dịch vụ bên ngoài, do đó được thực hiện theo cách chính xác và phản hồi được xử lý chính xác. Mục tiêu của nó là giảm chi phí thời gian của dev khi một máy khách mới muốn tiêu thụ dịch vụ bên ngoài.Thiết kế một gói Nuget với Dependency Injection

Gói nuget được xây dựng từ một dự án duy nhất, được gọi là 'khách hàng', trong giải pháp của dịch vụ bên ngoài. Điều này là để các dự án khách hàng có thể chia sẻ một tên miền phổ biến và cũng giữ cho xây dựng số đồng bộ cho khi nó được xuất bản. Dự án khách hàng áp dụng đảo ngược nguyên tắc điều khiển, nghĩa là lớp hoạt động như điểm vào (bắt đầu của ngăn xếp để nhận phản hồi từ dịch vụ bên ngoài) có một số phụ thuộc giao diện.

Chúng tôi thường sử dụng StrucutreMap làm vùng chứa IoC của chúng tôi, nhưng tôi tự hỏi làm thế nào chúng tôi cấu hình dự án khách hàng của chúng tôi với tiêm phụ thuộc 'được xây dựng trong'? Có vẻ như sai lầm mà mọi người tiêu dùng phải có dây để giải quyết sự phụ thuộc vào gói. Tuy nhiên, nó cũng không phải là trường hợp mà mọi khách hàng nên sử dụng StructureMap và phải thêm lớp 'ClientRegistry' (initializer) vào logic khởi động của riêng nó.

Có nguyên tắc hướng dẫn nào để giúp giải quyết vấn đề này không? Hoặc bất kỳ ví dụ tốt về gói nuget phức tạp được xây dựng trên nguyên tắc IoC?

Trả lời

2

Bạn có thể sử dụng CommonServiceLocator - nó không hoàn toàn phong phú như một thùng chứa IoC đầy đủ nhưng nó sẽ làm cho gói hàng của bạn trở nên bất khả tri và cho phép người tiêu dùng gói của bạn tiếp tục sử dụng container IoC theo lựa chọn của họ.

Thư viện cung cấp trừu tượng hơn các bộ chứa IoC và định vị dịch vụ. Sử dụng thư viện cho phép ứng dụng truy cập gián tiếp vào các khả năng mà không dựa vào các tham chiếu cứng. Hy vọng là việc sử dụng thư viện này, các ứng dụng của bên thứ ba và các khung công tác có thể bắt đầu tận dụng IoC/Service Location mà không bị buộc phải thực hiện cụ thể.

+1

Lưu ý rằng CSL chỉ cung cấp chức năng Giải quyết, nhưng bạn có thể thêm 'MyNyGetPackage.Integration.StructureMap' thứ hai tích hợp với StructureMap. – Steven

+0

Tôi đã thực hiện một số đọc xung quanh CSL và tôi có thể thấy lợi ích của nó nhưng tôi vẫn còn bối rối về cách tiếp cận vấn đề. Tôi có nên cố gắng vạch trần việc triển khai IServiceLocator mà ứng dụng tiêu thụ có thể 'nối thêm' vào thiết lập IoC của riêng nó không? Hay tôi chỉ dựa vào tham chiếu CSL hiện có trong người tiêu dùng và gọi 'ServiceLocator.SetLocatorProvider' với một thùng chứa chỉ bên trong máy khách trong một số nhiệm vụ khởi tạo? Không phải là có một nguy cơ ghi đè container người tiêu dùng hiện tại với cách tiếp cận này? – Nick

+1

@Nick ah Tôi nghĩ tôi thấy bạn đến từ đâu. Trong trường hợp đó tôi đã nhìn thấy một số dự án sử dụng autofac trong nội bộ (tức là thiết lập nội bộ và autofac được ilmerged vào lắp ráp) mà sau đó phơi bày một đối tượng nhà máy với thế giới bên ngoài. Nhà máy sau đó trở thành điểm vào chính vào gói và nội dung của nó. – MattDavey

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