统一引导程序之间的区别
Difference between unity bootstrappers
它们有什么区别:
- Unity.AspNet.WebApi
- Unity.WebForms
- 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 将容器的父实例放在应用程序缓存中,每个请求都会将自己的子容器添加到请求项集合中。
希望对您有所帮助。
它们有什么区别:
- Unity.AspNet.WebApi
- Unity.WebForms
- 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 将容器的父实例放在应用程序缓存中,每个请求都会将自己的子容器添加到请求项集合中。
希望对您有所帮助。