2013-05-28 27 views
9

Trong mã bootstrapping StructureMap của tôi, tôi đang sử dụng một quy ước tùy chỉnh để quét các assembly và thêm các cặp giao diện/triển khai vào đồ thị đối tượng như các cá thể có tên. Về cơ bản, tôi có một số logic kiểm tra cài đặt cấu hình và thực hiện theo tuyên bố này tùy thuộc vào các điều kiện khác nhau:Các trường hợp được đặt tên và một thể hiện mặc định trong StructureMap?

registry.For(interfaceType).Use(type) 
    .Named(implementationName); 

Điều này bổ sung tất cả các trường hợp được đặt tên đủ tốt. Tuy nhiên, tôi cũng muốn thêm một cá thể mặc định trong trường hợp một tên cá thể không được chỉ định. Tuy nhiên, trường hợp mặc định không phải lúc nào cũng là phiên bản cuối cùng được thêm vào biểu đồ. Đôi khi các trường hợp được đặt tên khác được thêm vào sau đó trong quá trình quét. Có vẻ như, mặc dù, bất kỳ trường hợp nào được thêm vào cuối cùng, bất kể nó có được đặt tên hay không, luôn luôn là mặc định.

Tôi đã thử kết hợp khác nhau của các API thông thạo, bao gồm:

registry.For(interfaceType).Add(type); 

hay:

registry.For(interfaceType).Use(type); 

Thậm chí một số trong những người được đánh dấu là bị phản đối. Nhưng hành vi kết quả luôn là hành vi cuối cùng là mặc định. Vì vậy, nếu lệnh triển khai thêm là một cái gì đó như thế này:

  1. Đối với giao diện Logger sử dụng thực hiện Log4Net tên "Log4Net"
  2. Đối với giao diện Logger sử dụng thực hiện Log4Net theo mặc định
  3. Đối với giao diện Logger sử dụng triển khai Mock có tên là "Mock"

Hành vi kết quả là triển khai "Mock" được sử dụng làm mặc định khi không có tên được chỉ định. Debugging vào AllInstances trong container, tôi nhìn thấy theo thứ tự sau:

  1. Một thể hiện của các logger Log4Net tên "Log4Net"
  2. Một thể hiện của các logger Log4Net với một GUID cho một tên (giống như bất kỳ mặc định khác Ví dụ, như xa như tôi có thể nói)
  3. một thể hiện của các logger Mock tên "Mock"

Debugging vào một tuyên bố đăng nhập khi gọi từ container mà không cần một cái tên chẳng hạn, tuy nhiên, kết quả trong việc thực hiện Mock đang được sử dụng.

Có cách nào để thêm trường hợp mặc định vào biểu đồ đối tượng trong khi vẫn có thể thêm các trường hợp được đặt tên sau đó không?

Trả lời

20

Phương thức Add sẽ thêm trường hợp (nếu bạn cần thêm các trường hợp được đặt tên hoặc thêm nhiều phiên bản để sử dụng với bộ sưu tập/liệt kê). Nếu không có mặc định rõ ràng được đăng ký (sử dụng phương thức Use), trường hợp cuối cùng được thêm vào sẽ trở thành trường hợp mặc định. Phương pháp Use được thiết kế để thiết lập trường hợp mặc định. Nếu bạn gọi Use nhiều lần, phiên bản cuối cùng được đăng ký sẽ trở thành mặc định.

Để thiết lập một trường hợp mặc định và sau đó đăng ký thêm tên trường bạn sẽ có thể để làm điều đó như thế này:

registry.For(typeof(Logger)).Use(typeof(Log4Net)).Named("Log4Net"); 
registry.For(typeof(Logger)).Add(typeof(Mock)).Named("Mock"); 

này sẽ làm cho Log4Net dụ mặc định và cũng có thể truy cập như một trường hợp được đặt tên. Ví dụ Mock sẽ có sẵn dưới dạng phiên bản được đặt tên.

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