Dependency injection 在ASP.NET中使用Unity.WebForms

Dependency injection 在ASP.NET中使用Unity.WebForms,dependency-injection,webforms,unity-container,Dependency Injection,Webforms,Unity Container,我试图在webforms项目中实现DI,因此我在UI层中安装了Unity.webforms DLL。我一开始就用UnityWebFormsStart类文件为我创建了一个应用程序启动文件夹。在这个文件中有一个RegisterDependencies方法,它要求进行编辑 注册依赖项后的下一步是什么?是否需要在Global.asax类文件中添加一些内容?如何以及在何处解析Web表单中的类型?我是否用属性来装饰它?Unity.WebFormsdll和NuGet包在后台为您做了一些事情。它将确保在每个新w

我试图在webforms项目中实现DI,因此我在UI层中安装了Unity.webforms DLL。我一开始就用UnityWebFormsStart类文件为我创建了一个应用程序启动文件夹。在这个文件中有一个RegisterDependencies方法,它要求进行编辑


注册依赖项后的下一步是什么?是否需要在Global.asax类文件中添加一些内容?如何以及在何处解析Web表单中的类型?我是否用属性来装饰它?

Unity.WebFormsdll和NuGet包在后台为您做了一些事情。它将确保在每个新web请求开始时启动子容器,并在每个请求结束时释放子容器。这允许您以“每web请求”的方式注册组件(在Unity中使用
HierarchyCallifeTimeManager
),这对于诸如O/RM工作单元之类的组件非常有用,例如实体框架的
DbContext

包确保的另一件事是指定的HttpHandler(通常是您的页面)及其所有子控件都是可用的。构建方法是初始化不是由容器本身创建的组件的方法

因此,我们的想法是在页面类和控件中使用属性注入,但在应用程序中的所有其他组件中只使用构造函数注入。构造函数注入是执行依赖项注入的首选机制,但遗憾的是,在ASP.NET页面和控件类中不可能进行构造函数注入

因此,您的页面可以如下所示:

public类取消订单页:第页
{
[依赖性]
公共ICommandHandler CancelOrderHandler{get;set;}
作废取消按钮\u单击(对象发送者,事件参数e){
此.CancelOrderHandler.Handle(新的CancelOrder{
OrderId=Guid.Parse(this.OrderIdHiddenField.Value)
});
}
}
对于应用程序的其余部分,请使用构造函数注入:

公共类CancelOrderHandler:ICommandHandler
{
私有只读IAuthorizedRepository orderRepository;
私有只读IEventPublisher事件发布器;
public CancelOrderHandler(IAAuthorizedRepository orderRepository,
IEventPublisher事件发布者){
this.orderRepository=orderRepository;
this.eventPublisher=eventPublisher;
}
公共无效句柄(CancelOrder命令){
//一些实现
}
}
RegisterDependencies
中,您必须注册依赖项。您可以手动执行此操作:

container.RegisterType();
container.RegisterType();
container.RegisterType(
类型(授权还原),
类型(DbContextRepo));

或者您也可以使用。

我编写了Unity.WebForms NuGet包,Steven在上面提供的答案绝对正确。有关如何工作的更多信息,您可以通过项目网站上的Wiki阅读。注意-由于第三方库的一些问题,我目前正在添加指定您希望从依赖项注入扫描中排除的名称空间的功能。我有一些空闲时间,希望能尽快进行测试和检查。为什么我们需要Unity.WebForms或Unity.MVC?这些层位于MS.Entlib.P&P之上吗?实际上我们只能使用Entlib女士的统一,对吗?并在webforms、mvc、web api中构建我们自己的DI…@legends这两个项目帮助配置P&P的企业库代码附带的Unity。Unity.webforms尤其是早该发布了,我非常感谢@KyKo将其发布出来。MSDN应用程序的示例代码在其实现中非常糟糕。自.NET Framework 4.7.2以来,现在可以在ASP.NET Web表单中为页面和控件使用构造函数注入。请看这里: