零星的“一个界面,无法构建。你错过了一个类型映射”

时间:2012-01-26 20:20:59

标签: asp.net-mvc unity-container

网站的初始部署工作正常。大约2-3个小时后,控制器突然无法实例化,因为依赖无法解决(或者至少是错误消息告诉我的)。

我尝试了各种各样的东西,但似乎都没有解决它。有没有人有任何想法我可以检查?

2 个答案:

答案 0 :(得分:0)

最近我们遇到了一个与拦截器类似的情况。突然间它就不再起作用了。我们拦截对程序集X.Y.Z. dll 中定义的接口的所有调用。但操作系统决定在一段时间后调用文件X.Y.Z. DLL 。在此期间没有发生新的部署。但突然之间名称匹配失败了。您是否按名称在配置中加载了一些程序集?也许你应该在字符串比较中检查IgnoreCase。

另一个想法:你是否为对象使用某种缓存?还是基于缓存的LifetimeManager?如果缓存项在一段时间后失效,则会丢失这些对象。

答案 1 :(得分:0)

我仍然不知道发生了什么,但我设法修复它。我正在使用第三方引导库来注册我的组件和映射。但是在用MEF滚动自己,并自己控制注册后,问题就消失了。我猜它是通过处理不应该有的东西来做一些时髦的事情。谢谢你的帮助。

如果有人使用http://bootstrapper.codeplex.com/使用以下声明遇到此问题:

    Bootstrap.Bootstrapper
        .With.Unity()
        .And.AutoMapper()
        .And.ServiceLocator()
        .Start();

我将其替换为:

    IUnityContainer container = new UnityContainer();
    MEFContainer mefContainer = new MEFContainer();
    mefContainer.UnityRegistry.ForEach(x => x.Register(container));
    container.RegisterInstance<IMappingEngine>(Mapper.Engine);
    mefContainer.AutoMapperRegistry.ForEach(x => x.CreateMap(Mapper.Configuration));

,其中

    private class MEFContainer
    {
        [ImportMany(typeof(IUnityRegistration))]
        public List<IUnityRegistration> UnityRegistry { get; set; }

        [ImportMany(typeof(IMapCreator))]
        public List<IMapCreator> AutoMapperRegistry { get; set; }

        public MEFContainer()
        {
            var catalog = new DirectoryCatalog("bin");
            var compositionContainer = new CompositionContainer(catalog);
            compositionContainer.ComposeParts(this);
        }
    }

请注意,IUnityRegistration.Register()和IMapCreator.CreateMap()是在第三方代码中定义的。 MEF引用System.ComponentModel.Composition 和System.ComponentModel.Composition.Hosting。最终会重构。