2011-01-10 12 views
13

Ben ExportMetaData aşağıdaki Dersimde ayarlanmış öznitelikleri var:ExportMetaData, tekli w/custom özniteliğinin yanı sıra birden çok değerle nasıl ayarlanır?

public interface IDocumentViewerMetaData { 
    /// <summary> 
    /// Gets the format. 
    /// </summary> 
    /// <value>The format.</value> 
    IEnumerable<DocFormat> Formats { get; } 
    /// <summary> 
    /// Gets the name of the viewer 
    /// </summary> 
    /// <value>The name.</value> 
    string Name { get; } 
    /// <summary> 
    /// Gets a value indicating whether this viewer supports editing 
    /// </summary> 
    /// <value><c>true</c> if [supports editing]; otherwise, <c>false</c>.</value> 
    bool SupportsEditing { get; } 
    } 

Ve tabii benim ImportMany:

[Export(typeof(IDocumentViewer))] 
    [ExportMetadata("Name", "MyViewer")] 
    [ExportMetadata("SupportsEditing", true)] 
    [ExportMetadata("Formats", DocFormat.DOC, IsMultiple = true)] 
    [ExportMetadata("Formats", DocFormat.DOCX, IsMultiple = true)] 
    [ExportMetadata("Formats", DocFormat.RTF, IsMultiple = true)] 

Ben de destekleyici bir arayüze sahip Ne yapardım

[ImportMany(typeof(IDocumentViewer))] 
public IEnumerable<Lazy<IDocumentViewer, IDocumentViewerMetaData>> _viewers { get; set; } 

Bunu yapmak, ExportMetaData özniteliğini kullanmak yerine güçlü yazılan bir öznitelik sınıfı kullanmaktır. Tek bir değeri de desteklerken bunu yapmanın bir yolunu anlayamadım (yukarıdaki örnekte Name, SupportsEditing).

Aşağıdaki benzer bir şey yapıyor tasavvur (ya da her neyse en iyisi olarak önerilir):

[Export(typeof(IDocumentViewer))] 
[DocumentViewerMetadata(Name = "MyViewer")] 
[DocumentViewerMetadata(SupportsEditing = true)] 
[DocumentViewerMetadata(Format = DocFormat.DOC)] 
[DocumentViewerMetadata(Format = DocFormat.DOCX)] 

ben bunu yapmanın bir yolu var IS olduğundan oldukça eminim, ben sadece doğru yolu bulamadı noktaları birleştir. :)

cevap

17

Kendi uygulamasıyla ExportAttribute alt sınıf ve kompozisyon sırasında kullandığı meta vekil proje MEF özelliklerini kullanmasına izin vermek bir MetadataAttribute ile dekore edebilirsiniz:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property), 
MetadataAttribute] 
public class ExportDocumentViewerAttribute : ExportAttribute, IDocumentViewerMetadata 
{ 
    public ExportDocumentViewer(string name, bool supportsEditing, params DocFormat[] formats) 
    : base(typeof(IDocumentViewer)) 
    { 
    if (string.IsNullOrEmpty(name)) 
     throw new ArgumentException("Export requires a name", "name"); 

    Name = name; 
    SupportsEditing = supportsEditing; 
    Formats = formats ?? Enumerable.Empty<DocFormat>(); 
    } 

    public string Name { get; private set; } 

    public bool SupportsEditing { get; private set; } 

    public IEnumerable<DocFormat> Formats { get; private set; } 
} 

[ExportDocumentViewer("Word", true, DocFormat.DOC, DocFormat.DOCX)] 
public WordDocumentViewer : IDocumentViewer 
{ 
    // Stuff 
} 

Not seni Aslında, MEF, onu bağımsız olarak yansıtacağı için IDocumentViewerMetadata sözleşmenizle dekore etmenize gerek yok, sadece meta veri sözleşmesinde değişiklikler yapıp yapmadığımı, özel dışa aktarma özelliğimin uygun olduğunu bilmeyi tercih ediyorum.

+0

Matthew - teşekkürler! Yaptığınız değişiklikleri anladım ve aslında onları tercih ederim - sınıflara uygulanacak daha az özellik ve bazı ek tip güvenlik (Arabirimi uygulayarak). Ayrıca, şimdi birden çok öğeyi geçebildiğim kadarıyla neyi kaçırdığımı biliyorum .. param []! Çözüme çok yakındım ama o küçük noktayı kaçırdım. Mükemmel cevabınız için çok teşekkür ederim. –