你能用MEF水合静电吗?

Mas*_*low 9 .net static-methods mef

我可以在类的静态构造函数中加水吗?

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);
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ted 15

不,MEF不支持静态导入.

  • 从容器中提取值并将其填充到静态属性中的+1不是重要的.使用容器的重点是它负责自动注入依赖项.如果你打算自己这样做,你也可以完全抛弃容器.可重用,可单元测试,松散耦合的代码应该避免静态成员.静态成员将所有东西粘在一块大泥浆中. (8认同)
  • @Maslow您放在静态成员上的Import属性没有做任何事情.您可以删除该属性,您的代码将以相同的方式工作.这就是为什么我们不认为它是一个重要的原因. (3认同)

Mas*_*low 1

这比我想象的要容易。

 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>>>( );
    }
Run Code Online (Sandbox Code Playgroud)

将类型更改为,Action<IEnumerable<ProjectLogicChecks>>以便我可以显示多个项目或整个解决方案的结果,而不仅仅是一个。

我按照这篇文章获取静态属性集,然后在没有扩展名的情况下提供本地默认值

  • 这是一个丑陋的解决方案。使用 MEF 你不应该需要静态的东西。您可以仅导入具有共享零件创建策略的内容,并且它的行为是静态的。 (4认同)