这个问题似乎已经被问了多次,但我还没有找到任何实际可行的答案。简单来说,我如何从MEF容器中删除某些内容。
即使在此处显示的代码https://mef.codeplex.com/wikipage?title=Parts%20Lifetime下的AddPart/RemovePart也不能按照列表中所示进行编译。该代码显示为:
这段代码无法编译,因为调用 RemovePart 需要 ComposablePart,而 root 明显不是这样的。其他简单的示例演示了如何创建部件并删除部件,但是在删除时会记住对已创建部件(作为 ComposablePart)的引用。我不想在每次创建容器中的部件时都保留对其的引用,我只想在应用程序的任意点从容器中删除部件,而无需始终保留对它的引用。
以下是我尝试使用上面链接文档中完全相同的模式所做的事情:
但是这使我得到了以下编译错误:
参数1:无法将‘System.Lazy’转换为‘System.ComponentModel.Composition.Primitives.ComposablePart’ C:\Users\irbldr.CORP\Documents\Visual Studio 2012\Projects\ConsoleApplication4\Program.cs
这与我直接使用上面链接文档中的代码得到的错误完全相同。
是否没有一种简单地从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);
这段代码无法编译,因为调用 RemovePart 需要 ComposablePart,而 root 明显不是这样的。其他简单的示例演示了如何创建部件并删除部件,但是在删除时会记住对已创建部件(作为 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();
}
}
但是这使我得到了以下编译错误:
参数1:无法将‘System.Lazy’转换为‘System.ComponentModel.Composition.Primitives.ComposablePart’ C:\Users\irbldr.CORP\Documents\Visual Studio 2012\Projects\ConsoleApplication4\Program.cs
这与我直接使用上面链接文档中的代码得到的错误完全相同。
是否没有一种简单地从MEF容器中移除某些内容的方法?