У меня сейчас большие проблемы с 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, эта проблема возникает.
Правильно ли я его настроил?