2011-08-15 9 views
6

Tôi đang làm việc trên mã cũ.Cấu trúcMap Chỉ định các đối số lập trình rõ ràng

Tôi có các phương thức khác nhau của cùng một lớp chuyển các đối số khác nhau tới hàm tạo của một phụ thuộc. Tôi đang cố gắng để có được một số cách sử dụng IoC cơ bản được giới thiệu. Ngay bây giờ tôi có StructureMap chuyển các đối số của tôi như thế này:

var thing = ObjectFactory.GetInstance<IThingInterface>(new ExplicitArguments(
     new Dictionary<string, object> { 
      { "constructorArgA", notShown }, 
      { "constructorArgB", redacted.Property } })); 

Nơi các thuộc tính thực tế được chuyển cho hàm tạo và thay đổi tùy thuộc vào vị trí của tôi.

Thay vì "constructorArgA" là có một cách để cấu hình này thông qua các loại thực tế, như bạn có thể làm khi cấu hình objectFactory, như:

x.For<IHidden>().Use<RealType>() 
    .Ctor<IConfig>().Is(new Func<IContext, IConfig>(
     (context) => someMethodToGetIConfig())); 

Nếu tôi đang viết này từ đầu tôi muốn có lẽ cấu trúc các phụ thuộc có một chút khác biệt để tránh điều này, nhưng đó không phải là một lựa chọn cho tôi ngay bây giờ.

+0

HOẶC tôi có nên chuyển sang tính năng tiêm tài sản thay vì phun phương tiện xây dựng không? –

Trả lời

3

Đây là một câu hỏi cổ điển/phổ biến với DI Containers.

Lựa chọn đầu tiên của tôi là tạo một nhà máy trừu tượng "thủ công" để tạo IThingInterface và sau đó sử dụng Structuremap để tiêm IThingInterfaceFactory nơi cần thiết. Bởi nhà máy thủ công, tôi có nghĩa là một lớp các cuộc gọi mới ThingInterface() và trả về nó. Nếu bạn thực hiện theo cách này, việc triển khai của bạn sẽ không còn được quản lý vùng chứa nữa và nếu có phụ thuộc, chúng sẽ không còn được cung cấp bởi vùng chứa (có thể hoặc không có vấn đề với bạn).

Lựa chọn thứ hai là tạo một nhà máy trừu tượng sử dụng/kết thúc tốt đẹp vùng chứa. Vì vậy, về cơ bản đoạn mã đầu tiên của bạn nhưng được bọc trong một lớp nhà máy nơi mà phương thức Create() lấy các tham số của bạn. Điều này có lợi thế của mọi thứ (bao gồm việc bạn triển khai và các phụ thuộc của nó) được quản lý bằng container, nhưng bất lợi khi tham chiếu trực tiếp vùng chứa của bạn (đây không phải là cách thực hành tốt nhất - xem Article on Composition Roots).

Bạn cũng có thể làm tiêm setter, nhưng cá nhân tôi sẽ coi đó là phương sách cuối cùng.

Castle Windsor có giải pháp tốt cho vấn đề này được xây dựng trong (Typed Factory Facility). Không chắc chắn nếu chuyển vùng chứa trong một tùy chọn, nhưng bạn có thể xem xét nó.