The Unity.WebForms
dll 和 NuGet 包在后台为您做一些事情。它将确保子容器在每个新 Web 请求开始时启动,并在每个请求结束时处置。这允许您以“每个网络请求”的方式注册组件(使用HierarchicalLifetimeManager
在 Unity 中),这对于诸如实体框架之类的 O/RM 工作单元之类的组件很有用DbContext
.
该包确保的另一件事是给定的 HttpHandler(通常是您的 Page)及其所有子控件Built up。 BuildUp 方法是初始化不是由容器本身创建的组件的方法。
因此,我们的想法是在页面类和控件中使用属性注入,但在应用程序的所有其他组件中仅使用构造函数注入。构造函数注入是执行依赖项注入的首选机制,但不幸的是,构造函数注入在 ASP.NET Page 和 Control 类中是不可能的。
所以你的页面可能看起来像这样:
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
}
}
In the RegisterDependencies
您必须注册您的依赖项。您可以手动执行此操作:
container.RegisterType<ICommandHandler<CancelOrder>, CancelOrderHandler>();
container.RegisterType<IEventPublisher, InProcessPublisher>();
container.RegisterType(
typeof(AuthorizedRepository<>),
typeof(DbContextRepo<>));
或者你可以使用批量注册.