统一引导程序之间的区别

Difference between unity bootstrappers

它们有什么区别:

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

如果我想在带有 WebAPI 的网络表单应用程序中使用 DI,是否需要,即 1 和 2?

干嘛不直接用Microsoft.Practices.Unity,这个lib不就可以实现各种场景下的D了吗?

编辑: 为什么 Unity.WebForms 构建控件树,如果你只想为你的 IRepository 使用 DI?

 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]);
            }
        }

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

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

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

希望对您有所帮助。