【问题标题】:Difference between unity bootstrappers统一引导程序之间的区别
【发布时间】:2015-04-02 20:44:07
【问题描述】:

它们有什么区别:

  1. Unity.AspNet.WebApi
  2. Unity.WebForms
  3. Microsoft.Practices.Unity.WebApi

如果我想在带有 WebAPI 的 webforms 应用程序中使用 DI,我需要 1 和 2 吗?

为什么不直接使用Microsoft.Practices.Unity,这个lib还不足以在各种场景下实现D吗?

编辑: 例如,如果您只想为您的 IRepository 提供 DI,为什么 Unity.WebForms 会构建控件树?

 private void OnPageInitComplete(object sender, EventArgs e)
        {
            foreach (Control controlTree in UnityHttpModule.GetControlTree((Page)sender))
            {
                string fullName = controlTree.GetType().FullName ?? string.Empty;
                string str = (controlTree.GetType().BaseType != null ? controlTree.GetType().BaseType.FullName : string.Empty);
                if (!this.Prefixes.All<string>((string p) => !fullName.StartsWith(p)) || !this.Prefixes.All<string>((string p) => !str.StartsWith(p)))
                {
                    continue;
                }
                UnityContainerExtensions.BuildUp(this.ChildContainer, controlTree.GetType(), controlTree, new ResolverOverride[0]);
            }
        }

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api webforms unity-container


    【解决方案1】:

    我只能代表 Unity.WebForms,因为那是我写的,我还没有时间看其他的。它们之间的差异很可能围绕每个框架提供的拦截点。 MVC 提供了 IDependencyResolver 接口,允许您挂钩到对象创建过程。这对于 WebAPI 应该非常相似(因为它与 MVC 共享大量代码),但我最近还没有能力使用 WebAPI。

    与 MVC 不同,WebForms 在对象创建时没有拦截点,因此我们不能进行构造函数注入(首选)。我们能做的最好的就是在执行转移到您的页面之前进行属性注入。为此,我们遍历控件树,寻找具有[Dependency] 属性的控件(使用Unity 的Buildup 方法)。最新版本的 Unity.WebForms 允许您指定在执行 DI 时要忽略的命名空间(默认情况下忽略 System.*),因此您可以在遍历控件树时限制其范围(在使用 3rd-party 控件库时非常有用,例如Telerik)。

    如果您打算在同一个项目中使用 WebForms 和 WebAPI,您可能需要从源代码自定义它们以确保您使用的是同一 Unity 容器实例。 Unity.WebForms 将容器的父实例放在应用程序缓存中,并且每个请求都会将其自己的子容器添加到请求项集合中。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      相关资源
      最近更新 更多