C# 除非在代码中放置断点,否则MEF导入ins为null

C# 除非在代码中放置断点,否则MEF导入ins为null,c#,mef,C#,Mef,我在一个项目上使用MEF,但在运行应用程序时,它遇到了解决导入问题的噩梦 它声明对象为null并抛出异常错误 如果我在本地调试应用程序并放置断点,它将解析。似乎在打开应用程序时无法解决此问题 下面是我的MEF解析器类,它是从global.asax初始化的 public class MEFDependencyResolver : IDependencyResolver { public MEFDependencyResolver() { container = ne

我在一个项目上使用MEF,但在运行应用程序时,它遇到了解决导入问题的噩梦

它声明对象为null并抛出异常错误

如果我在本地调试应用程序并放置断点,它将解析。似乎在打开应用程序时无法解决此问题

下面是我的MEF解析器类,它是从global.asax初始化的

public class MEFDependencyResolver : IDependencyResolver
{
    public MEFDependencyResolver()
    {
        container = new CompositionContainer
        (
            new AggregateCatalog
            (
                AppDomain.CurrentDomain
                         .GetAssemblies()
                         .Where(a => a.FullName.StartsWith("T20Cricket2014"))
                         .Select(a => new AssemblyCatalog(a))
            )
        );
    }

    public object GetService(Type serviceType)
    {
        return GetType().GetMethods().First(m => m.IsGenericMethod && m.Name == "GetService").MakeGenericMethod(serviceType).Invoke(this, null);
    }
    public T GetService<T>()
    {
        try
        {
            var export = container.GetExport<T>();
            return export == null ? default(T) : export.Value;
        }
        catch(Exception)
        {
            return default(T);
        }
    }
    public IEnumerable<object> GetServices(Type serviceType)
    {
        return new object[0];
    }

    readonly CompositionContainer container;
}

不确定这是由于MEF的稳定性问题还是我做错了什么。

在断点上暂停执行时,即使您不检查任何值,它也能工作吗?我曾经遇到过类似的情况,因为我在代码暂停时检查了一个对象,调试器导致加载一个延迟加载的值,所以在我调试时一切都正常。这就是你所说的Heisenbug..请看一看,因为泛型方法可能是延迟加载的。有时它在检查值的同时进行调试并命中断点,有时则不起作用。我已将解决方案改为MVC而不是webapi,现在它工作正常。
[Export]
public class DefaultBuilder
{
    [Import]
    public IUserData Users;

    public Default Build(string ID)
    {

        var user = Users.Get(ID);
        var isNull = user == null;
        return new Default
        {
            Registered = user != null,
            User = isNull ? null : user.Name
        };
    }
}