Unity 2 ведет себя странно с генериками - PullRequest
0 голосов
/ 22 июня 2011

У меня сейчас большие проблемы с Unity 2 в моем проекте MVC 3.

Я создал абстрактный BaseViewPage, от которого наследуются все viewpages. В этом у меня есть 2 зависимости. Все идет нормально. Теперь у меня есть 3 разных ViewPages, которые наследуются от BaseViewPage. Они используют дженерики для доставки определенных данных в представление. Все идет нормально. Теперь приходит проблема. В моем homecontroller я использую единство, чтобы разрешить одну из этих страниц. Страница просмотра загружается правильно, когда я отлаживаю ее, но сразу после моего вызова, чтобы вернуть представление («индекс», модель); Unity вызывает одну из этих зависимостей на странице baseview. Это делается, когда httpcontext равен нулю.

Конфигурация Unity (загружает все страницы просмотра):

container.RegisterType<IBackendWrapper, BackendWrapper.BackendWrapper>(new PerThreadLifetimeManager());
            container.RegisterType<BaseViewPage, EmptyViewPage>("EmptyViewPage");
            container.RegisterType(typeof(BaseViewPage), typeof(GenericViewPage<>), "GenericViewPage");
            container.RegisterType(typeof(BaseViewPage), typeof(GenericIEnumerableViewPage<>), "GenericIEnumerableViewPage");

BaseViewPage и одна страница общего вида (остальные общие страницы выглядят почти одинаково):

public abstract class BaseViewPage 
{
        [Dependency]
        public IBackendWrapper Backend { get; set; }
        ....
}

public class GenericViewPage<T> : BaseViewPage
{
    public T Model { get; set; }

    public GenericViewPage(T model)
        : base()
    {
        Model = model;
    }
}

Теперь в моем домашнем контроллере у меня сначала есть зависимость от Backend (чтобы проверить, что он работает), затем внутри Index я использую Unity для разрешения одной страницы общего вида:

public class HomeController : Controller
{
    [Dependency]
    public IBackendWrapper Backend { get; set; }

    public ActionResult Index(MvcLoginUser user)
    {
        var model = UnityGlobalContainer.Container.Resolve<GenericViewPage<MvcLoginUser>>("GenericViewPage");
        return View("Index", model);
    }
 }

Теперь после возврата, unity делает вызов объекта BackendWrapper. Точнее BackendWrapper.UserIdent.TheLogin. TheLogin выдает ошибку, так как HttpContext отсутствует. Вопрос в том, почему единство пытается получить к нему доступ? Я реализовал dispose внутри BackendWrapper и внутри UserIdent, но Unity игнорирует их и по-прежнему вызывает TheLogin.

Внутри BackendWrapper у меня есть конструктор, который вызывает внешнюю DLL для создания нового UserIdent. Так что ничто не решает Единство. Но единство все еще пытается получить к нему доступ. Кроме того, если я удаляю зависимость из BaseViewPage, она работает отлично. Таким образом, только когда BaseViewPage имеет зависимость от BackendWrapper, эта проблема возникает. Правильно ли я его настроил?

1 Ответ

0 голосов
/ 22 июня 2011

Я обнаружил, что этот "Application_EndRequest" был вызван ДО того, как единство очистило его объекты. Это, в свою очередь, прервало наш сеанс NHibernate, поэтому, когда единство попыталось избавиться от всех объектов внутри созданных классов, произойдет сбой. До сих пор не выяснили, почему он пытается избавиться от не созданных классов. Класс обертки был создан единицей, а класс обертки, в свою очередь, создал UserIdent. Я предполагаю, что сборщик мусора или что-то еще запускалось и пыталось просмотреть все созданные классы и их дочерние объекты. Это было сделано за пределами HttpContext, что привело к нескольким исключениям.

...