我在VS 2012中使用MEF,WebAPI。
我收到错误
“exceptionMessage”:“尝试创建'ClienteController'类型的控制器时发生错误。确保控制器 有一个无参数的公共 构造 “” exceptionType。 “:” System.InvalidOperationException“
我在Global.asax.cs:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer container = MEFLoader.Init(catalog.Catalogs);
DependencyResolver.SetResolver(new MefDependencyResolver(container)); // view controllers
GlobalConfiguration.Configuration.DependencyResolver = new MefAPIDependencyResolver(container); // web api controllers
}
在我的MEFLoader课程中
public static CompositionContainer Init(ICollection<ComposablePartCatalog> catalogParts)
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(BuscadorClient).Assembly));
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Core.DataRepositoryFactory).Assembly));
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Comun.DataContract.BusinessFault).Assembly));
if (catalogParts != null)
foreach (var part in catalogParts)
catalog.Catalogs.Add(part);
var container = new CompositionContainer(catalog);
return container;
}
Assemblies在Integration环境中的Webapi应用程序网站的bin文件夹中。
注意:
在开发环境中,dev本地,有时失败,解决方案是“重新编译”WebApi App Project(csproj)
无论如何,在Integration环境中失败。
Microsoft.Internal.Collections.WeakReferenceCollection
1.<CleanupDeadReferences>b__0(WeakReference w)\r\n at System.Collections.Generic.List
1.RemoveAll(Predicate1 match)\r\n at Microsoft.Internal.Collections.WeakReferenceCollection
1.Add(T item)\ r \ n在System.ComponentModel.Composition.Hosting.ImportEngine.StartSatisfyingImports(PartManager) partManager,AtomicComposition atomicComposition)\ r \ n在System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImports(PartManager partManager,ComposablePart part,Boolean shouldTrackImports)\ r \ n在System.ComponentModel.Composition.Hosting.ImportEngine.SatisfyImports(ComposablePart part) )\ r \ n在System.ComponentModel.Composition.Hosting.CompositionServices.GetExportedValueFromComposedPart(ImportEngine engine,ComposablePart part,ExportDefinition定义)\ r \ n在System.ComponentModel.Composition.Hosting.CatalogExportProvider.GetExportedValue(CatalogPart part,ExportDefinition export,在System.ComponentModel.Composition.ReflectionModel.ImportingItem.CastSingleExportT的System.ComponentModel.Composition.Primitives.Export.get_Value()\ r \ n中的布尔isSharedPart)\ r \ n oImportType(类型类型,导出导出)\ r \ n在System.ComponentModel.Composition.ReflectionModel.ReflectionComposablePart.SetImport(ImportingItem item,Export [] exports)\ r \ n在System.ComponentModel.Composition.ReflectionModel.ReflectionComposablePart.SetImport(在System.ComponentModel.Composition.Hosting的System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImportsStateMachine(PartManager partManager,ComposablePart部分)\ r \ n的ImportDefinition定义,IEnumerable1 exports)\r\n at System.ComponentModel.Composition.Hosting.ImportEngine.PartManager.TrySetImport(ImportDefinition import, Export[] exports)\r\n at System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImportSubset(PartManager partManager, IEnumerable
1进口,AtomicComposition atomicComposition)\ r \ n .ImportEngine.TrySatisfyImports(PartManager partManager,ComposablePart part,Boolean shouldTrackImports)\ r \ n在System.ComponentModel.Composition.Hosting.ImportEngine.SatisfyImports(ComposablePart part)\ r \ n在System.ComponentModel.Composition.Hosting.CompositionServices.GetExportedValueFromComposedPart (ImportEngine引擎,ComposablePart部分,ExportDefinition定义)\ r \ n在System.ComponentModel.Composition.Hosting.CatalogExportProvider中.GetExportedValue(CatalogPart部分,ExportDefinition export,Boolean isSharedPart)\ r \ n在System.ComponentModel.Composition.Primitives.Export.get_Value()\ r \ n在COMPANY..Core.MefExtensions.GetExportedValueByType(CompositionContainer容器,类型类型)在
答案 0 :(得分:6)
不确定是否还有人对此答案感兴趣,但我在使用MEF作为IoC的WebApi服务中遇到了同样的问题。组合容器在启动时创建,并带有自定义导出提供程序列表。
我的问题的原因是导出提供程序不是使用thread safe constructor创建的。
在这种情况下,除了在创建CompositionContainer时设置线程安全选项外,还应使用将线程安全设置为true的构造函数创建所有自定义导出提供程序。
var aggregate = new AggregateCatalog(assemblyCatalogs);
//create default export provider to be thread safe
var defaultExportProvider = new CatalogExportProvider(aggregate, true);
_compContainer = new CompositionContainer(CompositionOptions.DisableSilentRejection|CompositionOptions.IsThreadSafe, defaultExportProvider);
defaultExportProvider.SourceProvider = _compContainer;