Вы можете увлажнить статическое свойство, используя MEF? - PullRequest
9 голосов
/ 16 августа 2010

Могу ли я гидрировать это внутри статического конструктора класса?

public class Connect:IDTExtensibility2, IDTCommandTarget
  static Connect()
    {
        //hydrate static properties?
    }
    [Import]
    public static Action<ProjectLogicChecks> Display { get; set; }

[Export(typeof(Action<ProjectLogicChecks>))]
    private static void DisplayResults( CheckProcesses _checkResults)
{
    MessageBox.Show(_checkResults.ProjectLogicCheck.AssemblyName + " has problems=" +
                    _checkResults.ProjectLogicCheck.HasProblems);
}

Ответы [ 3 ]

15 голосов
/ 17 августа 2010

Нет, MEF не поддерживает статический импорт.

2 голосов
/ 18 ноября 2011

Вы можете использовать [ImportingConstructor] и установить статическое свойство в конструкторе.

private static RandomService Random { get; set; }  
[ImportingConstructor] 
public ClientViewModel(RandomService random)
 {   
 Random = random; 
} 

Только не устанавливайте это в статическое поле.

1 голос
/ 17 августа 2010

Это было проще, чем я думал.

 static Connect()
    {
        var batch = new CompositionBatch( );
        CompositionContainer container;
        var reflectionCatalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly( ));

        var extensionPath = System.IO.Path.Combine(Environment.CurrentDirectory, "extensions");
        if (System.IO.Directory.Exists(extensionPath))
        {
            var directoryCatalog = new DirectoryCatalog(extensionPath);
            var defaultCatalogEp = new CatalogExportProvider(reflectionCatalog);
            container=new CompositionContainer(directoryCatalog, defaultCatalogEp);
            defaultCatalogEp.SourceProvider=container;
        }
        else
            container = new CompositionContainer(reflectionCatalog);

        container.Compose(batch);
 //Setting a static property
        Display=container.GetExportedValue<Action<IEnumerable< ProjectLogicChecks>>>( );
    }

Изменил тип на Action<IEnumerable<ProjectLogicChecks>>, чтобы я мог отображать результаты для нескольких проектов или всего решения вместо одного.*

Я следовал этой статье , чтобы получить набор статических свойств, затем это для предоставления локальных значений по умолчанию в случае отсутствия расширения.

...