Tôi biết đã có rất nhiều câu hỏi liên quan đến việc tạo tham số constructor bằng MEF, nhưng có một chút khác biệt.MEF: Truyền các tham số hàm tạo khác nhau cho một phần khi sử dụng CreationPolicy.NonShared
Tôi muốn biết rằng có cách nào để chuyển các giá trị tham số khác nhau cho hàm tạo của một phần khi tôi đang sử dụng tổ hợp PartCreationPolicy(CreationPolicy.NonShared)
và GetExportedValue
không?
Ví dụ:
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export]
public partial class Foo
{
[ImportingConstructor]
public Foo([Import("SomeParam")]object parameter)
{
...
}
}
và ở một nơi khác ...
container.ComposeExportedValue("SomeParam", "Some value...");
var instance = container.GetExportedValue<Foo>();
Trong ví dụ trên, tôi có thể sử dụng ComposeExportedValue
chỉ một lần, như chạy nó một lần thứ hai sẽ gây ra một ChangeRejectedException
.
Vì vậy, câu hỏi của tôi là:
- Có cách nào khác để thay đổi giá trị của
SomeParam
trong kịch bản trên, đối với từng trường hợp mới? - Nếu không, các cách khác có thể thực hiện được gì mà không cần sử dụng bất kỳ khung công tác DI nào khác? Một điều cần lưu ý là tạo một dịch vụ để trưng ra một cái gì đó như
System.Collections.Concurrent.ConcurrentQueue
nơi tôi enqueue một giá trị tham số trước khi gọiGetExportedValue
và sau đó dequeue giá trị trong constructor của một phần. Nhưng đó là một hack và cũng tạo ra nhiều vấn đề hơn là giải quyết. - Nếu câu trả lời cho cả hai câu hỏi trên là không, thì có cách nào khác để thực hiện điều này với sự kết hợp của MEF và một số khung DI/IOC khác không?
Cảm ơn bạn đã được trợ giúp. :)
Kính trọng,
Yogesh Jagota
Tôi đang tìm tích hợp AutoFac/MEF nhưng làm cách nào tôi có thể xử lý đăng ký khi sử dụng 'RegisterComposablePartCatalog'? Tôi không thể sử dụng 'Đăng ký' ở đây vì nó được thực hiện bởi AutoFac tự động. Làm thế nào tôi có thể nói với AutoFac rằng một xuất khẩu nhất định cần phải được khởi tạo bằng cách sử dụng một constructor không mặc định với các tham số mà tôi cung cấp mà không sử dụng '[ImportingConstructor]'? – Yogesh
@Yogesh: Bạn có thể có một số thành phần được đăng ký với AutoFac (khi bạn cần kiểm soát chi tiết) và xuất khác với MEF (khi bạn cần khám phá động của plugin). Nhưng bạn không thể trộn cả hai cho cùng một thành phần. Một tùy chọn khác là chuyển sang AutoFac hoàn toàn; bạn có thể sử dụng [Quét] (http://code.google.com/p/autofac/wiki/Scanning) để có được khám phá động giống như MEF khi cần. –
Nó thực sự hiệu quả. Cách thực hiện nó là sử dụng phương thức 'Update' của' IContainer' cho phép thêm đăng ký mới vào một vùng chứa hiện có. Cảm ơn. :) – Yogesh