0

我现在在我的 MVC 3 项目中遇到 Unity 2 的大麻烦。

我创建了一个抽象的 BaseViewPage ,所有视图页都继承自它。在这我有2个依赖项。到目前为止,一切都很好。现在我有 3 个从 BaseViewPage 继承的不同 Viewpage。这些使用泛型将一些特定数据传递给视图。到目前为止,一切都很好。现在问题来了。在我的家庭控制器中,我使用统一来解决其中一个视图页面。视图页在我调试时正确加载,但在我调用 return view("index", model); 之后立即加载。unity 调用 baseviewpage 中的这些依赖项之一。这是在 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;
    }
}

现在在我的家庭控制器中,我首先依赖于后端(以测试它是否有效),然后在索引中我使用统一来解析一个通用视图页面:

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。问题是,为什么统一尝试访问它?我已经在 BackendWrapper 和 UserIdent 内部实现了一个处理,但统一忽略它们并仍然调用 TheLogin。

在 BackendWrapper 内部,我有一个构造函数,它调用外部 dll 来创建新的 UserIdent。因此,Unity 没有解决任何问题。但是统一仍然试图访问它。此外,如果我从 BaseViewPage 中删除依赖项,它会完美运行。所以只有当 BaseViewPage 依赖于 BackendWrapper 时才会出现这个问题。我是否正确配置它?

4

1 回答 1

0

我发现这个“Application_EndRequest”在统一清理它的对象之前被击中。这反过来又终止了我们的 NHibernate 会话,因此当 unity 尝试处理创建的类中的所有对象时,它会失败。仍然没有弄清楚为什么它会尝试处理未创建的类。包装类是由统一创建的,而包装类又创建了 UserIdent。我的猜测是垃圾收集器或其他东西运行并试图遍历所有创建的类及其子对象。这是在 HttpContext 之外完成的,这导致了几个异常。

于 2011-06-22T15:19:25.033 回答