这个问题似乎已被问过几次,但我还没有找到任何实际有效的答案.很简单,我如何从MEF容器中删除一些东西.
即使这里显示的代码https://mef.codeplex.com/wikipage?title=Parts%20Lifetime在AddPart/RemovePart下也不起作用,因为它不会按列出的方式进行编译.代码显示了这个:
var catalog = new AssemblyCatalog(typeof(Program).Assembly);
var container = new CompositionContainer(catalog);
var root = new Root();
// add external part
container.ComposeParts(root);
// ... use the composed root instance
// removes external part
batch = new CompositionBatch();
batch.RemovePart(root);
container.Compose(batch);
Run Code Online (Sandbox Code Playgroud)
这将无法编译,因为对RemovePart的调用需要一个根本没有的ComposablePart.其他简单示例显示如何创建零件并删除零件,但会记住对创建零件的引用(如ComposablePart),因此删除仅使用该引用.我不希望在创建容器时保持对容器中每个部分的引用,我只想在应用程序中的任意点从容器中删除一个部分,而不必始终保持对它的引用.
以下是我尝试使用上面链接的文档中列出的完全相同的模式:
public class Program
{
[Import]
private IClass myClass;
public Program()
{
var container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
container.ComposeParts(this);
var partToRemove = container.GetExport<IClass>();
var batch = new CompositionBatch();
batch.RemovePart(partToRemove);
container.Compose(batch);
}
public static void Main(string[] args)
{
var program = new Program();
}
}
Run Code Online (Sandbox Code Playgroud)
但这给了我以下编译错误:
参数1:无法从'System.Lazy'转换为'System.ComponentModel.Composition.Primitives.ComposablePart'C:\ Users\irbldr.CORP\Documents\Visual Studio 2012\Projects\ConsoleApplication4\Program.cs
如果我直接使用上面链接的文档中的代码,那么我得到的错误完全相同.
有没有办法简单地从MEF容器中删除一些东西?
小智 0
此链接可能会有所帮助:当我更改零件时,How do I get MEF to recompose?
但长话短说:您可以从 MEF 中删除实例,但如果不删除完整的目录、重新组合和过滤它(只是不添加某些内容),则无法删除导出定义。
| 归档时间: |
|
| 查看次数: |
3079 次 |
| 最近记录: |