gpt4 book ai didi

c#-4.0 - 在 MEF 中,如何避免使用 DirectoryCatalog 对导出进行不必要的类型扫描以提高性能?

转载 作者:行者123 更新时间:2023-12-01 12:43:04 24 4
gpt4 key购买 nike

我有大约 20 个 dll,导出、导入部分。每个 dll 中都有一个类,具有导入和导出属性。但是在编写 MEF 时会扫描 dll 中可用的所有类型。

下面的结果仅取自一个 dll 的输出。

因此,compose 方法需要时间。如何避免不必要的类型扫描?

    sample plugin

[ModuleAttibute("MENU")]
[ExportMetadata("SAMPLE", "SAMPLE")]
public class MenuModule : IModule
{
}

public static bool CheckParts(ComposablePartDefinition partDef)
{
var keepPart = (from e in partDef.ExportDefinitions
where e.Metadata.ContainsKey("Sample")
select e).Any();

return keepPart;
}


public class FilteredCatalog : ComposablePartCatalog
{
private readonly ComposablePartCatalog _inner;
private readonly Func<ComposablePartDefinition,bool> _partsQuery;

public FilteredCatalog(ComposablePartCatalog inner, Func<ComposablePartDefinition, bool> expression)
{
_inner = inner;
_partsQuery = expression;
}

public override IQueryable<ComposablePartDefinition> Parts
{
get
{
return FilterParts();
}
}

public IQueryable<ComposablePartDefinition> FilterParts()
{
return (from p in _inner.Parts
let keepPart = _partsQuery(p)
where keepPart == true
select p);
}
}

var cat1 = new DirectoryCatalog(ConfigurationManager.AppSettings["Path"].Replace("~", exeDirectory), "*PlugIn*.dll");

var filteredCat1 = new FilteredCatalog(cat1, CheckParts);
_catalog.Catalogs.Add(filteredCat1);
var cc1 = new CompositionContainer(_catalog);
cc1.ComposeParts(this);

结果

System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.DbTypes' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.EnvironmentInfo' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.Interfaces.IHost' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.Interfaces.IModule' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.Interfaces.IPlugIn' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.Interfaces.IModuleAttribute' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.Interfaces.IModuleHandler' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.Interfaces.ISNLogin' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.ModuleAttibute' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.FilteredCatalog' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'PlugIn.Core.PlugInBase' was ignored because it contains no exports.

System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'OneSystem.Shell.Properties.Resources' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'OneSystem.Shell.Properties.Settings' was ignored because it contains no exports.

另一个插件输出,在撰写时花费了 2000 毫秒。项目共扫描400种。

System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.AppLauncher' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.Bootstrapper' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.FrmMap' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.FrmOverView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.IArrivalDetailsView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.ucArrivalDetails' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.ArrivalDetailsPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.ICargoPortDetailsView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.ucCargoPortDetails' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.CargoPortDetailsPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.IGeneralPortAgentInfoView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.ucPortAgentInfo' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.PortAgentInfoPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.IPieChartActivitiesFactsView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.ucPieChartActivities' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.PieChartActivitiesFactsPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.IPortAlertsView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.ucPortAlerts' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.PortAlertsPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.IVRSView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.ucVRS' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.OverView.VRSPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.iPositionExplorer' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.FrmPositionExplorerNew' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.FrmAdjustSpeed' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.ICargoDialogView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.frmCargoDialogBox' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.FormPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.FrmCreateDADesk' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.FrmCreateDADeskByAgent' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.FrmCreateDADeskByAgentPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.IFrmCreateDADeskByAgentView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.FrmDebunker' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.LogAbstractDialogFormView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.frmLogAbstractDialogBox' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.FormLogAbstractPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PerformanceDetailsDialogView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.frmPerformanceDialogBox' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PerformanceDetailsDialogPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.FrmPortCallBunkerDetail' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.FrmROEDialogBox' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.FrmSteamDialogBox' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.IFrmAdjustROBView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.FrmAdjustROB' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.FrmAdjustROBPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.FrmBrowser' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.FrmUpdateDADesk' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorerNewPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.IUserControlView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.ITabView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucFixtureNote' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.FixtureNotePresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.LogAbstractView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucLogAbstract' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.LogAbstractPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ILogAbstractDetailView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.IPositionDetailTab' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucLogAbstractDetails' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.LogAbstractDetailPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PerformanceDetailsView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucPerformanceDetails' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PerformanceDetailsPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.IPortCallActivityView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.ucPortCallActivities' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PortCallActivityPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.IPortCallBunkerDetailView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.IPortBunkerDetOuterView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.ucPortCallBunkerDetail' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PortCallBunkerDetailPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ICommentsView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucPortCallComments' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PortCallCommentsPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.IPortCallDAView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucPortCallDA' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PortCallDAPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.IPortCallFactView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucPortCallFact' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PortCallFactPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.IPortCallHistory' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.UcPortCallHistory' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PortCallHistoryPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ITaskView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucPortCallTask' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.TaskPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.UcArrDepPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.IUcArrDepView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ICargoFactView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucCargoFacts' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.CargoFactPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PortBunkerPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.IPortBunkerView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.ICargoView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.ucCargoes' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.CargoPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.IUserControlView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.ucPortLogCargo' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.ucPortLogCargoPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.ClonePositionCargo' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.IPositionSearchAdditionalView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucPositionSearchAdditional' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PositionSearchAdditionalPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.IPositionSearchBasicView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucPositionSearchBasic' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.PositionSearchBasicPresenter' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.IUpdateDADeskView' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.ucUpdateDADesk' was ignored because it contains no exports.
System.ComponentModel.Composition Information: 6 : The ComposablePartDefinition 'ERP.VM.UI.PositionExplorer.UpdateDADeskPresenter' was ignored because it contains no exports.

最佳答案

要消除扫描,您可以将 DirectoryCatalog 替换为 TypeCatalog,如下所示:

var cat1 = new TypeCatalog(typeof(Type1), typeof(Type2), ...);

但是,您可能希望自动发现插件。这就是您首先使用 DirectoryCatalog 的原因,对吗?如果不实际扫描所有类型以查看导出了哪些类型,就无法做到这一点。

您确定是扫描花费了大量时间吗?也许是 CheckParts 代码(未在您的问题中显示)正在减慢速度。尝试取消使用 FilteredCatalog 以检查其对性能的影响。

编辑:我刚刚意识到您可能多次构建组合容器,这就是 2 秒加载时间 Not Acceptable 原因。解决方法是仅在应用程序启动时构建组合容器一次

关于c#-4.0 - 在 MEF 中,如何避免使用 DirectoryCatalog 对导出进行不必要的类型扫描以提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22559620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com