2011-11-18 21 views
8

Hãy tưởng tượng chúng ta có một lớpLàm thế nào để tiêm luận constructor từ tập tin cấu hình với Unity

public class MyClass 
{ 
    private string _val; 
    public MyClass(string val) 
    { 
     _val = val; 
    } 
} 

và app.config (hoặc web.config)

<appSettings> 
    <add key="value" value="some value" /> 
</appSettings> 

Có cách nào để đăng ký kiểu MyClass trong Unity container và point Unity để chèn giá trị cho tham số constructor val từ file config?

+0

bản sao có thể có của [Cấu hình trong Unity, cách chuyển kết nốiBắt đầu đến một hàm tạo?] (http://stackoverflow.com/questions/4252231/ in-unity-config-how-to-pass-connectionstring-to-a-constructor) –

Trả lời

6

nó rất dễ dàng.

C# Code:

var container = new UnityContainer(); 
container.LoadConfiguration(); 
MyClass mc = container.Resolve<MyClass>(); 

Cấu hình file:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">  
<container> 
    <register type="[namespace].MyClass, [assembly-name]" 
    mapTo="[namespace].MyClass, [assembly-name]"> 
    <constructor> 
     <param name="val" value="Ethan Woo"/> 
    </constructor> 
    </register> 
</container> 

+1

Tham chiếu tới ứng dụngĐặt tên "giá trị" trong tệp cấu hình này ở đâu? – brentlightsey

+0

: "giá trị" thuộc tính ở đây. –

+0

Không có tham chiếu đến tệp cấu hình. Sau đó, cách ánh xạ tệp cấu hình hoặc chỉ từ ? –

5

Nếu bạn đang sử dụng XML cấu hình bạn có thể làm điều này bằng cách định nghĩa một phần mở rộng để xử lý AppSettings như thông số Unity, xem http://www.neovolve.com/2010/04/23/appsetting-parameter-injection-in-unity-2/.

Ngoài ra, nếu bạn đang làm cấu hình C# bạn có thể sử dụng một constructor tiêm như sau ...

var container = new UnityContainer(); 
container.RegisterType<MyClass>(
    new InjectionConstructor(
     InjectionParameter<string>(ConfigurationManager.AppSettings["value"]))); 

Lý do để sử dụng giá trị AppSettings chứ không phải là chuỗi trực tiếp trong cấu hình XML là nó centralises tất cả các giá trị paramter vào AppSettings và đơn giản hóa việc di chuyển giữa các môi trường.

+0

tại sao chức năng loại đăng ký 'RegisterType ()' chỉ định hai tên cùng một lớp? – Mou

+0

Đăng ký XML ban đầu cho biết loại, bản đồĐể có cùng loại trong cả hai vì vậy tôi đã tái tạo điều đó. Đối với việc đăng ký lưu loát, bạn đúng, bạn không cần giá trị thứ hai; tuy nhiên bạn thường có RegisterType

3

một bài cũ Khá nhưng tôi nghĩ rằng các thông tin sau có thể hữu ích trong trường hợp đó nó không phải là một giá trị cho một loại bản địa nhưng một kiểu dữ liệu phức tạp thay vì:

<configuration> 
 

 
    <configsections> 
 
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"> 
 
    </section> 
 
    </configsections> 
 

 
    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> 
 

 
    <alias alias="IRepository" type="UnityTest.IRepository, UnityTest"> 
 
     <alias alias="Repository" type="UnityTest.Repository, UnityTest"> 
 

 
     <container> 
 
      <register mapto="Repository" type="IRepository"> 
 

 
      <register name="MyClass" type="UnityTest.MyClass, UnityTest"> 
 
       <constructor> 
 
       <param name="repository" type="IRepository"> 
 
       <dependency name="IRepository"> 
 

 
       </dependency> 
 
       </constructor> 
 
      </register> 
 

 
      </register> 
 
     </container> 
 

 
     </alias> 
 
    </alias> 
 
    </unity> 
 

 
</configuration>

Một chút mô tả chi tiết hơn tại đây: http://postlabs.blogspot.com/2015/05/injecting-non-native-data-type-via.html

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