Произошла ошибка активации при попытке получить экземпляр типа - PullRequest
1 голос
/ 21 февраля 2012

Я использую Unity с приложением Asp.net MVC 3. Вот код, выполняющийся в Application_Start ...

        UnityContainer container = new UnityContainer();

        new UnityMappings(container).RegisterTypes();

        DependencyResolver.SetResolver(new UnityServiceLocator(container));

Контроллеры зарегистрированы в экземпляре UnityMappings, как это ...

IEnumerable<Type> controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                                            where typeof (IController).IsAssignableFrom(t)
                                            select t;

    foreach (Type t in controllerTypes)
    {
        container.RegisterType(t);
    }

Когда я запрашиваю страницу, я получаю следующие ошибки ... (Последняя относится к запрашиваемому представлению.)

Произошла ошибка активации при попытке получить экземпляр типа IControllerFactory, ключ ""

Произошла ошибка активации при попытке получить экземпляр типа IControllerActivator, ключ ""

Произошла ошибка активации при попытке получить экземпляр типа IViewPageActivator, ключ ""

Произошла ошибка активации при попытке получить экземпляр типа МодельMetadataProvider, ключ ""

И потом, как ни странно, я могу просмотреть все исключения, и страница работает абсолютно нормально! Все остальные зависимости разрешены просто отлично.

Это не проблема Visual Studio, потому что это происходит в разных случаях на разных машинах. Мне пришлось отключить нарушение всех исключений, чтобы я мог сделать что-нибудь.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Эта ошибка, похоже, исчезла, когда я ее использую ...

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

... где UnityDependencyResolver определяется как ...

public class UnityDependencyResolver : IDependencyResolver
{
    private readonly IUnityContainer container;

    public UnityDependencyResolver(IUnityContainer container)
    {
        this.container = container;
    }

    #region IDependencyResolver Members

    public object GetService(Type serviceType)
    {
        try
        {
            return container.Resolve(serviceType);
        }
        catch
        {
            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return container.ResolveAll(serviceType);
        }
        catch
        {
            return new List<object>();
        }
    }

    #endregion
}

До того, как я использовалUnityServiceLocator, который определен в «Microsoft.Practices.Unity» следующим образом ...

DependencyResolver.SetResolver(new UnityServiceLocator(container));

Разве UnityServiceLocator не должен использоваться таким образом?

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

У меня были похожие проблемы с инъекцией при использовании Unity с сайтом MVC3, который использует скомпилированные представления.

Оказалось, что регистрация объектов в Application_Start означала, что они произошли слишком поздно в процессе запуска приложения.

Я использовал атрибут PreApplicationStartMethod, как объяснено здесь , чтобы запустить весь код для регистрации типов в отдельном статическом методе, который выполняется до события Application_Start.

Я не получал точно такие же ошибки, но это было в том же районе.Для тестирования не нужно слишком много усилий, поэтому стоит попробовать.

РЕДАКТИРОВАТЬ (поскольку поле комментария слишком маленькое)

ОК.По моему опыту исключение направления расследования из-за предположения обычно приводит к тому, что я теряю много времени.Конечно, вы всегда должны сначала попробовать самые простые или очевидные объяснения, однако вы, кажется, уже сделали это.

Сам код может быть в порядке, возможно, запрос на инъекцию вызывается раньше, чем вы.можно ожидать от вашего другого опыта из-за некоторой другой тонкой разницы в вашем приложении.

В моем случае, тот же самый код прекрасно работал в другом приложении, но в этом не работал, потому что я использовал скомпилированное представление.... что-то, что я думал в то время, было совершенно неактуально.

Это могло бы быть одним из многих вещей.Все перечисленные интерфейсы связаны с пространством имен System.Web.MVC, поэтому может возникнуть проблема с поиском (правильной) сборки.Если, как вы утверждаете, это не код, то тот факт, что это происходит только в этом приложении, но на нескольких компьютерах, указывает на то, что это может быть проблемой в одном из файлов web.config, возможно, из-за ссылок на сборки.Сгенерированное исключение предоставит больше информации, в частности, InnerException должно дать более подробную информацию о том, что на самом деле вызвало ошибку активации.Если вам не удастся использовать программу просмотра журнала Fusion для детализации загрузки сборки.

Не зная больше о приложении или самой ошибке, вероятно, будет трудно предложить более краткое предложение.

...