请让我看看代码。 我无法获得任何外部方法。 “操作”始终为空 “目录”是可以的-我看到它可以看到其中的所有Dll和方法。 “ AvailableNumberOfOperations”始终为0
public interface IOperation
{
string Render(string parameters);
}
public class Extensions
{
[ImportMany(typeof(IOperation))]
private IEnumerable<Lazy<IOperation>> operations;
private CompositionContainer _container;
public int AvailableNumberOfOperations
{
get { return operations != null ? operations.Count() : 0; }
}
public string RenderModule(string moduleName, string args)
{
var result = "";
if (AvailableNumberOfOperations != 0)
{
foreach (Lazy<IOperation> com in operations)
{
result = com.Value.Render(args);
}
}
return result;
}
public void LoadModules()
{
// called first !!
var catalog = new AggregateCatalog();
string path = HttpContext.Current.Server.MapPath("~/App_Data/Extensions/");
catalog.Catalogs.Add(new DirectoryCatalog(path));
_container = new CompositionContainer(catalog);
try
{
_container.ComposeParts();
}
catch (CompositionException compositionException)
{
Console.WriteLine(compositionException.ToString());
}
}
[Export(typeof(OnePlace.IOperation))]
[ExportMetadata("ModuleName", "HelloWorld")]
public class HelloWorld : IOperation
{
public string Render(string parameters)
{
return "Hello World";
}
}
[Export(typeof(OnePlace.IOperation))]
[ExportMetadata("ModuleName", "SeeYouWorld")]
public class SeeYouWorld : IOperation
{
public string Render(string parameters)
{
return "See You World";
}
}
}
外部DLL就是这样的。 我在主添加中有两种方法,一种在外部dll中 我必须编写所有这些注释才能插入所有代码。抱歉。 如果您能向我解释我的错误在哪里,这将非常有帮助-谢谢!我以前从未使用过MEF。
namespace SimpleMenu
{
[Export(typeof(OnePlace.IOperation))]
[ExportMetadata("ModuleName", "Menu")]
public class Menu : OnePlace.IOperation
{
public string Render(string parameters)
{
return "menu 13";
}
}
}
答案 0 :(得分:0)
您的Extensions
实例似乎是在MEF外部创建的,因此CompositionContainer
不知道有任何要满足的输入。
您可以通过以下方法解决此问题:
_container.SatisfyImportsOnce(this)
:
public void LoadModules()
{
// called first !!
var catalog = new AggregateCatalog();
string path = HttpContext.Current.Server.MapPath("~/App_Data/Extensions/");
catalog.Catalogs.Add(new DirectoryCatalog(path));
_container = new CompositionContainer(catalog);
try
{
_container.ComposeParts();
_container.SatisfyImportsOnce(this);
}
catch (CompositionException compositionException)
{
Console.WriteLine(compositionException.ToString());
}
}
看到类似的答案: SatisfyImportsOnce vs ComposeParts