如何使用自定义属性扩展mef

本文关键字:mef 扩展 自定义属性 何使用 | 更新日期: 2023-09-27 18:16:43

是否有可能向我的组件添加一些额外的属性,然后使用一些自定义逻辑/可能从数据存储设置/水合?类似于在cab/unity中添加一些自定义构建器策略?

更新例如

assuming a class has these properties
[MyImport]  string name1 { get; set }
[MyImport]  MyType name2 { get; set }
[MyGuid]  Guid { get; set; }

具有自定义属性MyImport和MyGuid,它们由MEF的"扩展"解析(在[imports]解析后执行),并具有以下代码行

// property SET
var valu = myDBStore.GetValue( instanceGUID, propertyInfo.Name);
propertyInfo.SetValue( instance, TypeDescripter.GetConverter(valu).ConvertTo(propertyType), null);
// property GET - for example only, used during dehydration outside of MEF !
var valu = propertyInfo.GetValue( instance, null);
myDBStore.SetValue( instanceGUID, propertyInfo.Name, TypeDescripter.GetConverter(valu).ConvertTo(typeof(string));
// the above is pseudo code only, pls no comments on correct args/syntax :)

如何使用自定义属性扩展mef

EDIT

components which are then set/hydrated using some custom logic/perhaps from a data store

可以通过"ExportFactory"来实现。

// "ExportFactory"
public sealed class DataStoreProvider
{
    [Export(typeof(Model))]
    public Model Item
    {
        get 
        {
            return [custom logic];
        }
    }
}
public class NeedsModel
{
    [Import(typeof(Model))]
    public Model Item { get; set; }
}

初始回答
这可以通过MEF的Lazy<T, TMetadata>实现。

public interface ISomeMetadata
{
    string UsefulInfo { get; }
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class ExportBaseAttribute : ExportAttribute, ISomeMetadata
{
    public ExportBaseAttribute(string usefulInfo)
        :base(typeof(BaseExport))
    {
        UsefulInfo = usefulInfo;
    }
    public string UsefulInfo { get; private set; }
}
// BaseExport class is not needed.. just showing advanced attribute usage.
public abstract class BaseExport { }
[ExportBase("Useful Filter Information")]
public class SomeExport : BaseExport
{
}

然后,在您的宿主(composer)中,您可以

[ImportMany(typeof(BaseExport))]
Lazy<BaseExport, ISomeMetadata>[] _baseExports

编写完成后,可以使用.Metadata

运行LINQ过滤器
var goodExports = from export in _baseExports
                  where export.Metadata.UsefulInfo ...
                  select export;