Как расширить mef с помощью пользовательских атрибутов? - PullRequest
1 голос
/ 02 декабря 2011

Можно ли добавить некоторые дополнительные атрибуты к моим компонентам, которые затем устанавливаются / увлажняются с использованием некоторой пользовательской логики / возможно, из хранилища данных?Похоже на добавление некоторой пользовательской стратегии построения в 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 (которое выполняется после[импорт] разрешен) и имеет следующий код:

// 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 :)

1 Ответ

2 голосов
/ 04 декабря 2011

РЕДАКТИРОВАТЬ

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
{
}

Затем, на вашем хосте (композиторе), вы можете

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

После того, как вы сочините,Вы можете запустить фильтр LINQ, используя .Metadata

var goodExports = from export in _baseExports
                  where export.Metadata.UsefulInfo ...
                  select export;
...