【问题标题】:Unity 2 is behaving strangely with genericsUnity 2 对泛型的行为很奇怪
【发布时间】:2011-06-22 13:08:21
【问题描述】:

我现在在我的 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 时才会出现这个问题。 我配置对了吗?

【问题讨论】:

    标签: c# asp.net-mvc-3 dependency-injection unity-container unity2.0


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      相关资源
      最近更新 更多