我在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;
}
在集成环境中,Webapi应用程序的bin文件夹中有Assemblies。
注意:
在开发环境、本地开发中,有时会出现失败的情况,解决方案是“重新编译”WebApi App项目(csproj)。
无论如何,在集成环境中都失败了。
Microsoft.Internal.Collections.WeakReferenceCollection<code>1.<CleanupDeadReferences>b__0(WeakReference w)\r\n at System.Collections.Generic.List</code>1.RemoveAll(Predicate<code>1 match)\r\n at Microsoft.Internal.Collections.WeakReferenceCollection</code>1.Add(T item)\r\n at System.ComponentModel.Composition.Hosting.ImportEngine.StartSatisfyingImports(PartManager partManager, AtomicComposition atomicComposition)\r\n at System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImports(PartManager partManager, ComposablePart part, Boolean shouldTrackImports)\r\n at System.ComponentModel.Composition.Hosting.ImportEngine.SatisfyImports(ComposablePart part)\r\n at System.ComponentModel.Composition.Hosting.CompositionServices.GetExportedValueFromComposedPart(ImportEngine engine, ComposablePart part, ExportDefinition definition)\r\n at System.ComponentModel.Composition.Hosting.CatalogExportProvider.GetExportedValue(CatalogPart part, ExportDefinition export, Boolean isSharedPart)\r\n at System.ComponentModel.Composition.Primitives.Export.get_Value()\r\n at System.ComponentModel.Composition.ReflectionModel.ImportingItem.CastSingleExportToImportType(Type type, Export export)\r\n at System.ComponentModel.Composition.ReflectionModel.ReflectionComposablePart.SetImport(ImportingItem item, Export[] exports)\r\n at System.ComponentModel.Composition.ReflectionModel.ReflectionComposablePart.SetImport(ImportDefinition definition, IEnumerable<code>1 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</code>1 imports, AtomicComposition atomicComposition)\r\n at System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImportsStateMachine(PartManager partManager, ComposablePart part)\r\n at System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImports(PartManager partManager, ComposablePart part, Boolean shouldTrackImports)\r\n at System.ComponentModel.Composition.Hosting.ImportEngine.SatisfyImports(ComposablePart part)\r\n at System.ComponentModel.Composition.Hosting.CompositionServices.GetExportedValueFromComposedPart(ImportEngine engine, ComposablePart part, ExportDefinition definition)\r\n at System.ComponentModel.Composition.Hosting.CatalogExportProvider.GetExportedValue(CatalogPart part, ExportDefinition export, Boolean isSharedPart)\r\n at System.ComponentModel.Composition.Primitives.Export.get_Value()\r\n at COMPANY..Core.MefExtensions.GetExportedValueByType(CompositionContainer container, Type type) in