使用Web Api和MEG时出错:确保控制器具有无参数的公共构造函数

时间:2015-01-28 13:38:48

标签: asp.net-web-api mef asp.net-web-api2

我在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(Predicate 1 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定义,IEnumerable 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 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容器,类型类型)在

1 个答案:

答案 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;
相关问题