Tôi đang sử dụng phân cấp vùng chứa để kiểm soát thời gian tồn tại của phần IDisposable. Thùng chứa con được đính kèm vào danh mục được lọc có chứa các phần không được chia sẻ. Dưới đây là đoạn mã:Phân cấp vùng chứa MEF và GetExports <T>
[Export(typeof(ITest)), PartCreationPolicy(CreationPolicy.NonShared)]
class Test : ITest, IDisposable
{
public void Dispose() {}
}
public interface ITest {}
class Program
{
static void Main()
{
// parent container to hold shared disposable parts
var cat = new AssemblyCatalog(typeof(Program).Assembly);
var parent = new CompositionContainer(cat);
// child container to hold non-shared disposable parts
var nsCat = CreateNonSharedPartCatalog(cat);
var child = new CompositionContainer(nsCat, parent);
// no cardinality mismatch exception: exactly one export found
var exp = child.GetExport<ITest>();
// lazy exports: count == 2 -- why?
var exports = child.GetExports<ITest>();
Console.WriteLine("Exports count = {0}", exports.Count());
}
static ComposablePartCatalog
CreateNonSharedPartCatalog(ComposablePartCatalog cat)
{
return new FilteredCatalog(cat,
def => def.Metadata.ContainsKey(
CompositionConstants.PartCreationPolicyMetadataName) &&
((CreationPolicy)def.Metadata[
CompositionConstants.PartCreationPolicyMetadataName]) ==
CreationPolicy.NonShared);
}
}
(Lớp FilterCatalog giống như được đề cập trong tài liệu MEF).
GetExport không ném ngoại lệ không hợp lệ về số lượng thẻ cho biết không có sự mơ hồ (chính xác một lần xuất được tìm thấy). Nhưng với sự ngạc nhiên của tôi, GetExports() trả về 2 hàng xuất khẩu lười biếng thay vì 1.
Tôi là lỗi này hoặc hành vi này là do thiết kế? Làm cách nào để tôi có thể thiết lập vùng chứa con để GetExports trả về một lần xuất trong mẫu này?
là bất kỳ thứ gì nhập 'ITest'? –
Không, tôi đã đăng đoạn mã hoàn chỉnh tại đây. Chỉ sử dụng và mã lớp FilteredCatalog được loại bỏ. – yallie