代码之家  ›  专栏  ›  技术社区  ›  Maslow

你能用MEF来定义一个静态属性吗?

  •  9
  • Maslow  · 技术社区  · 14 年前

    我可以在类的静态构造函数中使用它吗?

    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 回复  |  直到 14 年前
        1
  •  15
  •   Daniel Plaisted    14 年前

        2
  •  2
  •   KCT    13 年前

    您可以使用[ImportingConstructor]并在构造函数中设置静态属性。

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

        3
  •  1
  •   Maslow    14 年前

    这比我想象的要容易。

     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>> 这样我就可以显示多个项目或整个解决方案的结果,而不仅仅是一个。

    我跟着 this this 在没有扩展时提供本地默认值。