Tôi đang thử dùng Ninject và tôi đang sửa đổi mã tôi đã viết với Sơ đồ cấu trúc để xem nó dễ dàng như thế nào. Trong mã cơ sở này, tôi có một đồ thị các đối tượng có cấu hình khác nhau thông qua các cơ quan đăng ký Bản đồ Cấu trúc và một đối tượng được sử dụng khi được chạy thông qua một giá trị trong cơ sở dữ liệu (trong trường hợp này để lấy lại một cơ quan dịch vụ wcf với một số đối tượng được tiêm) . Ví dụ: (sử dụng mã Bản đồ Cấu trúc):Sử dụng tên để phân biệt đối tượng bằng cách sử dụng IoC
Registry 1 thiết lập tất cả các giá trị mặc định cho các loại IBusinessContext, IRules và ILogger. Điều này chỉ là thêm các kiểu GenericContext/Logger/Rules bên cạnh các giao diện mà không có chuyên môn nào khác.
public GenericRegistry()
{
// Set up some generic bindings here
For<ILogger>().Use<Loggers.GenericLogger>();
For<IBusinessRule>().Use<Rules.StandardRule>();
For<IBusinessContext>().Use<Contexts.GenericBusinessContext>();
For<ILoggerContext>().Use<Loggers.GenericLoggerContext>();
}
Đăng ký 2 thiết lập IBusinessTiếp theo để sử dụng lớp SpecialisedContext và yêu cầu người quản lý sử dụng SpecializedLogger. Ví dụ cho IBusinessContext được đặt tên là "SpecializedContext".
public SpecializedRegistry()
{
// Old style syntax as it affects the default for IBusinessContext
// Perhaps a hint at what I'm doing?
InstanceOf<IBusinessContext>().Is.OfConcreteType<Contexts.SpecializedBusinessContext>().Named(SpecializedInstanceName).Ctor<ILogger>().Is<Loggers.SpecialisedLogger>();
}
Tất cả đều hoạt động như mong đợi trong Bản đồ cấu trúc (tùy thuộc vào cú pháp cũ hoặc mới).
Tuy nhiên, khi tôi đã sử dụng Ninject tôi nhấn một vấn đề với hy vọng trường hợp chưa đặt tên là mặc định (không phải cách Ninject hoạt động, tôi nhận được điều đó). Điều này dẫn đến một số nghiên cứu mà tất cả đều gợi ý rằng việc sử dụng các cá thể có tên là A Really Bad Idea. Tôi hiểu rằng có nhiều cách tốt hơn để thực hiện việc này bằng cách sử dụng đăng ký tự động hoặc thuộc tính để đặt tên hoặc yêu cầu một loại nhất định, nhưng trong hệ thống tôi mô tả cần phải có cách để chạy ở trên cùng của cây (và để cho khuôn khổ IoC tìm ra phần còn lại dựa trên các loại hoặc quy tắc đã đăng ký).
Vì vậy ... tôi chỉ sử dụng khái niệm IoC sai ở đây bằng cách mong đợi để yêu cầu đối tượng cấp cao nhất của tôi theo tên hoặc có cách nào tốt hơn để làm những gì tôi đang cố gắng làm? Tôi có nên sử dụng một cái gì đó như MEF thay vào đó và xử lý tất cả điều này giống như plug-in?
Tôi nhấn mạnh Tôi không sử dụng điều này giống như một nhà máy câm và yêu cầu ở mỗi cấp mã cho một thể hiện loại x từ container, nó chỉ là hành động khởi tạo.
Cảm ơn trước cho thời gian của bạn và giúp :)
Cảm ơn Aaron! Đó là xóa một vài điều cho tôi :) Nó rất đánh giá cao. – NoodleAwa