2012-07-30 32 views
7

Tôi có constructorđi qua một phần của thông số nhà xây dựng lâu đài windsor chứa

Foo(IColor c , int someNumber) 

và tôi biết một số số chỉ trong thời gian chạy, và tôi muốn gọi constructor này trong thời gian giải quyết và vượt qua someNumber giá trị và các IColor để được giải quyết một cách độc lập.

Something như thế này:

container.Resolve<IFoo>(someNumber); 

Có thể được thực hiện?

Trả lời

7

Có, chuyển đối số hàm tạo trong một phiên bản của loại ẩn danh; tên tài sản phải phù hợp với tên tham số constructor:

IColor desiredColor = //whatever 
int desiredNumber = //whatever else 
IFoo foo = container.Resolve<IFoo>(new { c = desiredColor, somenumber = desiredArgumentValue }); 

Nếu bạn đang sử dụng một phiên bản cũ của C# không hỗ trợ kiểu nặc danh (hoặc thậm chí nếu bạn không phải), bạn có thể làm tương tự với một từ điển :

IColor desiredColor = //whatever 
int desiredNumber = //whatever 
Dictionary<string, object> arguments = new Dictionary<string, object>(); 
arguments.Add("c", desiredColor); 
arguments.Add("somenumber", desiredNumber); 
IFoo foo = container.Resolve<IFoo>(arguments); 
+0

Còn thông số IColor thì sao? – Darragh

+0

@Darragh Tôi đã chỉnh sửa câu trả lời để bao gồm một đối số tương ứng. – phoog

17

Bạn nên chọn Nhà máy được nhập thay vì sử dụng vùng chứa như định vị dịch vụ. Chỉ cần xác định giao diện nhà máy:

public interface IFooFactory { 
    IFoo Create(int somenumber); 
} 

và đăng ký nó như nhà máy gõ:

container.Register(Component.For<IFooFactory>().AsFactory()); 

Sau đó sử dụng dependency injection để bơm nhà máy và sử dụng nó:

var foo = fooFactory.Create(desiredArgumentValue); 

Để biết thêm thông read Windsor documentation

+0

Câu trả lời hay. Nó có nghĩa là nếu tôi sử dụng nhà máy này, tôi luôn luôn phải nhớ để phát hành các đối tượng sau khi sử dụng nó? Tài liệu nói "Hãy nhớ rằng theo mặc định, tất cả các thành phần trong Windsor là các bộ đơn và sử dụng thùng chứa chính sách phát hành mặc định giữ tham chiếu đến tất cả các thành phần, thậm chí là các thành phần tạm thời. các thành phần được giải quyết thông qua cơ sở. " –

+0

Vâng, đó là cách thực hành tốt nhất. Bạn có thể định nghĩa phương thức 'void Destroy (IFoo component)' trên giao diện nhà máy cho mục đích này, hoặc thực hiện 'IDisposable' trong thành phần của bạn và xử lý nó. Sau đó, nó sẽ được phát hành. –

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