Спорадический "интерфейс и не может быть построен. Вам не хватает отображения типов" - PullRequest
0 голосов
/ 27 января 2012

Первоначальное развертывание сайта работает нормально.Примерно через 2-3 часа контроллеры внезапно не могут быть созданы из-за того, что не может быть разрешена зависимость (или, по крайней мере, это то, о чем говорит мне сообщение об ошибке).решить это.У кого-нибудь есть идеи, что я могу проверить?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

Я до сих пор понятия не имею, что происходит, но мне удалось это исправить. я использовал стороннюю библиотеку начальной загрузки для регистрации своих компонентов и сопоставлений. но после того, как я справился с 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. Будет в конечном итоге рефакторинг.

0 голосов
/ 27 января 2012

Недавно у нас была похожая ситуация с одним из наших перехватчиков. Внезапно это больше не будет работать. Мы перехватываем все вызовы интерфейсов, определенных в сборке X.Y.Z. dll . Но ОС решила через некоторое время вызвать файл X.Y.Z. DLL . Никакого нового развертывания не произошло. Но внезапно совпадение имени не удалось. Вы загружаете некоторые сборки в вашей конфигурации по имени? Возможно, вам следует проверить IgnoreCase при сравнении строк.

Еще одна идея: вы используете какой-то кеш для ваших объектов? Или LifetimeManager на основе кеша? Если через некоторое время элементы кэша станут недействительными, вы потеряете эти объекты.

...