在 ASP.NET 中使用 Unity.WebForms
Using Unity.WebForms in ASP.NET
我正在尝试在 webforms 项目中实现 DI,所以我在我的 UI 层中安装了 Unity.WebForms dll。一旦我做了一个 App_Start 文件夹,它就为我创建了一个 UnityWebFormsStart class 文件。在这个文件中有一个方法 RegisterDependencies 要求被编辑。
注册依赖后下一步是什么?我需要在 Global.asax class 文件中添加什么吗?以及如何以及在何处解析网络表单中的类型?我是否用任何属性装饰它?
Unity.WebForms
dll 和 NuGet 包在后台为您做一些事情。它将确保子容器在每个新的 Web 请求开始时启动,并在每个请求结束时释放。这允许您注册具有 'per web request' 生活方式的组件(使用 Unity 中的 HierarchicalLifetimeManager
),这对于 O/RM 作品单元(例如 Entity Framework 等组件很有用DbContext
.
该包确保的另一件事是给定的 HttpHandler(通常是您的页面)及其所有子控件都是 Built up。 BuildUp 方法是初始化非容器本身创建的组件的方法。
所以我的想法是在页面 类 和控件中使用 属性 注入,但在应用程序的所有其他组件中单独使用构造函数注入。构造函数注入是进行依赖注入的首选机制,但不幸的是,构造函数注入在 ASP.NET 页面和控件 类.
中是不可能的
因此您的页面可能如下所示:
public class CancelOrderPage : Page
{
[Dependency]
public ICommandHandler<CancelOrder> CancelOrderHandler { get; set; }
void CancelButton_Click(object sender, EventArgs e) {
this.CancelOrderHandler.Handle(new CancelOrder {
OrderId = Guid.Parse(this.OrderIdHiddenField.Value)
});
}
}
对于应用程序的其余部分,使用构造函数注入:
public class CancelOrderHandler : ICommandHandler<CancelOrder>
{
private readonly IAuthorizedRepository<Order> orderRepository;
private readonly IEventPublisher eventPublisher;
public CancelOrderHandler(IAuthorizedRepository<Order> orderRepository,
IEventPublisher eventPublisher) {
this.orderRepository = orderRepository;
this.eventPublisher = eventPublisher;
}
public void Handle(CancelOrder command) {
// some implementation
}
}
在 RegisterDependencies
中,您必须注册您的依赖项。您可以手动执行此操作:
container.RegisterType<ICommandHandler<CancelOrder>, CancelOrderHandler>();
container.RegisterType<IEventPublisher, InProcessPublisher>();
container.RegisterType(
typeof(AuthorizedRepository<>),
typeof(DbContextRepo<>));
或者您可以使用 batch-registration.
我正在尝试在 webforms 项目中实现 DI,所以我在我的 UI 层中安装了 Unity.WebForms dll。一旦我做了一个 App_Start 文件夹,它就为我创建了一个 UnityWebFormsStart class 文件。在这个文件中有一个方法 RegisterDependencies 要求被编辑。
注册依赖后下一步是什么?我需要在 Global.asax class 文件中添加什么吗?以及如何以及在何处解析网络表单中的类型?我是否用任何属性装饰它?
Unity.WebForms
dll 和 NuGet 包在后台为您做一些事情。它将确保子容器在每个新的 Web 请求开始时启动,并在每个请求结束时释放。这允许您注册具有 'per web request' 生活方式的组件(使用 Unity 中的 HierarchicalLifetimeManager
),这对于 O/RM 作品单元(例如 Entity Framework 等组件很有用DbContext
.
该包确保的另一件事是给定的 HttpHandler(通常是您的页面)及其所有子控件都是 Built up。 BuildUp 方法是初始化非容器本身创建的组件的方法。
所以我的想法是在页面 类 和控件中使用 属性 注入,但在应用程序的所有其他组件中单独使用构造函数注入。构造函数注入是进行依赖注入的首选机制,但不幸的是,构造函数注入在 ASP.NET 页面和控件 类.
中是不可能的因此您的页面可能如下所示:
public class CancelOrderPage : Page
{
[Dependency]
public ICommandHandler<CancelOrder> CancelOrderHandler { get; set; }
void CancelButton_Click(object sender, EventArgs e) {
this.CancelOrderHandler.Handle(new CancelOrder {
OrderId = Guid.Parse(this.OrderIdHiddenField.Value)
});
}
}
对于应用程序的其余部分,使用构造函数注入:
public class CancelOrderHandler : ICommandHandler<CancelOrder>
{
private readonly IAuthorizedRepository<Order> orderRepository;
private readonly IEventPublisher eventPublisher;
public CancelOrderHandler(IAuthorizedRepository<Order> orderRepository,
IEventPublisher eventPublisher) {
this.orderRepository = orderRepository;
this.eventPublisher = eventPublisher;
}
public void Handle(CancelOrder command) {
// some implementation
}
}
在 RegisterDependencies
中,您必须注册您的依赖项。您可以手动执行此操作:
container.RegisterType<ICommandHandler<CancelOrder>, CancelOrderHandler>();
container.RegisterType<IEventPublisher, InProcessPublisher>();
container.RegisterType(
typeof(AuthorizedRepository<>),
typeof(DbContextRepo<>));
或者您可以使用 batch-registration.