gpt4 book ai didi

dependency-injection - 在 ASP.NET 中使用 Unity.WebForms

转载 作者:行者123 更新时间:2023-12-04 22:30:30 27 4
gpt4 key购买 nike

我正在尝试在 webforms 项目中实现 DI,因此我在 UI 层中安装了 Unity.WebForms dll。只要我这样做,就会使用 UnityWebFormsStart 类文件为我创建一个 App_Start 文件夹。在这个文件中有一个方法 RegisterDependencies 要求被编辑。

注册依赖项后的下一步是什么?我需要在 Global.asax 类文件中添加什么吗?以及如何以及在哪里解析网络表单中的类型?我用任何属性装饰它吗?

最佳答案

Unity.WebForms dll 和 NuGet 包在后台为您做一些事情。它将确保在每个新 Web 请求开始时启动子容器,并在每个请求结束时处理子容器。这允许您注册具有“每个 Web 请求”生活方式的组件(使用 Unity 中的 HierarchicalLifetimeManager),这对于诸如 O/RM 工作单元(如 Entity Framework 的 DbContext)等组件很有用。 .

包确保的另一件事是给定的 HttpHandler(通常是您的 Page)及其所有子控件是 Built up . BuildUp 方法是初始化不是由容器本身创建的组件的方法。

所以想法是在页面类和控件中使用属性注入(inject),但在应用程序的所有其他组件中仅使用构造函数注入(inject)。构造函数注入(inject)是进行依赖注入(inject)的首选机制,但不幸的是,构造函数注入(inject)在 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)
});
}
}

对于应用程序的其余部分,使用构造函数注入(inject):

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 .

关于dependency-injection - 在 ASP.NET 中使用 Unity.WebForms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28448212/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com