在 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.