2008-10-28 29 views
12

Làm cách nào để có thể chèn giá trị của mục nhập appSettings (từ app.config hoặc web.config) vào dịch vụ bằng cách sử dụng vùng chứa Windsor? Nếu tôi muốn tiêm giá trị của một tài sản Windsor vào một dịch vụ, tôi sẽ làm một cái gì đó như thế này:Tiêm cài đặt ứng dụng bằng cách sử dụng Windsor

<properties> 
    <importantIntegerProperty>666</importantIntegerProperty> 
</properties> 
<component 
    id="myComponent" 
    service="MyApp.IService, MyApp" 
    type="MyApp.Service, MyApp" 
    > 
    <parameters> 
     <importantInteger>#{importantIntegerProperty}</importantInteger> 
    </parameters> 
</component> 

Tuy nhiên, những gì tôi thực sự muốn làm là lấy giá trị đại diện bởi #{importantIntegerProperty} từ một cài đặt ứng dụng biến mà có thể được định nghĩa như thế này:

<appSettings> 
    <add key="importantInteger" value="666"/> 
</appSettings> 

EDIT: Để làm rõ; Tôi nhận ra rằng điều này là không thể thực sự với Windsor và David Hayden article rằng sliderhouserules đề cập đến thực sự là về container IoC của chính mình (David Hayden), chứ không phải Windsor.

Tôi chắc chắn không phải là người đầu tiên gặp vấn đề này vì vậy điều tôi muốn biết là làm cách nào để người khác giải quyết vấn đề này?

Trả lời

5

Tôi đã đưa ra giải pháp cho điều này cuối cùng dựa trên các gợi ý từ nhiều nguồn khác nhau trên web. Kết quả cuối cùng mặc dù tham gia khá nhiều sao chép ba lớp học từ Windsor đúng nguyên văn và sửa đổi chúng chỉ một chút. Kết quả cuối cùng là trên codeplex cho bạn thưởng thức.

http://windsorappcfgprops.codeplex.com/

tôi ban đầu đã viết mã này khá một số thời gian trước đây vì vậy nó dựa trên Windsor 1.0.3 - vâng, nó đã cho tôi rằng dài để có được xung quanh để xuất bản kết quả!

Mã này cho phép bạn có điều này trong app.config của bạn (hoặc web.config, rõ ràng):

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="theAnswer" value="42"/> 
    </appSettings> 
</configuration> 

... và truy cập nó từ Windsor tập tin cấu hình XML của bạn như thế này:

<?xml version="1.0" encoding="utf-8" ?> 
<castle> 
    <components> 
    <component 
     id="answerProvider" 
     service="Acme.IAnswerProvider, Acme" 
     type="Acme.AnswerProvider, Acme" 
     > 
     <parameters> 
     <theAnswer>#{AppSetting.theAnswer}</theAnswer> 
     </parameters> 
    </component> 
    </components> 
</castle> 

Có một ví dụ hoạt động trong giải pháp.

+5

Có một cách tiếp cận khác dựa trên thành phần DictionaryAdapter, được cung cấp OOTB trong Windsor 2.5 hoặc mới hơn http://codebetter.com/blogs/benhall/archive/2010/07/22/improving-testability-with-the-castle-dictionary- adapter.aspx –

+0

Cảm ơn bạn đã liên kết, Krzysztof. Tôi thích cách tiếp cận đó quá. –

2

I wrote a post về trường hợp tương tự cách đây vài tháng. Nó sử dụng SubDependencyResolver để chèn các tham số thích hợp. Trong trường hợp của bạn, bạn chỉ có thể thay đổi DynamicConfigurationSettings cho ConfigurationManager.

+0

Đẹp nhất. Cảm ơn, Mausch. Đó là con trỏ đúng hướng mà tôi đang tìm kiếm. –

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