Ioc和WebForms - 如何在用户控件中注入属性

时间:2014-12-16 14:52:31

标签: asp.net webforms inversion-of-control autofac

我正在将IoC添加到现有的Web表单项目中,并且我在注入用户控件的依赖项方面遇到了一些麻烦,尤其是母版页中的动态用户控件。

在母版页上,我加载了一些用户控件:

protected override void OnLoad(EventArgs e)
    {
        bool processComplete = false;
        var page = Page as BasePage;
        if (page != null && HttpContext.Current.User.Identity.IsAuthenticated)
            processComplete = page.processComplete ;

        var segments = this.Request.Url.Segments;
        Control bodyheader = null;
        if (processComplete )
        {
            if (segments.Count() > 1 && segments[1].StartsWith("evaluation", true, System.Globalization.CultureInfo.CurrentCulture))
                bodyheader = Page.LoadControl("~/Themes/HWP/HeaderNoSearch.ascx");
            else
                bodyheader = Page.LoadControl("~/Themes/HWP/Header.ascx");
        }
        else if (segments.Count() > 1 && segments[1].StartsWith("welcome", true, System.Globalization.CultureInfo.CurrentCulture))
        {
            bodyheader = Page.LoadControl("~/Themes/HWP/plainHeaderAuth.ascx");
        }
        else
        {
            bodyheader = Page.LoadControl("~/Themes/HWP/plainHeaderAuth.ascx");
        }
        plcBodyHeader.Controls.Add(bodyheader);

        Control bodyfooter = Page.LoadControl("~/Themes/HWP/Footer.ascx");
        plcBodyFooter.Controls.Add(bodyfooter);

        base.OnLoad(e);
    }

这些用户控件中的每一个都有一些依赖项。我可以在每个用户控件中手动注入依赖项:

protected override void OnInit(EventArgs e)
{
    var cpa = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance;
    var cp = cpa.ContainerProvider;
    cp.RequestLifetime.InjectProperties(this);
    base.OnInit(e);
}

但这似乎违背了使用IoC的目的。应该如何MasterPage - >页面 - > UserControls的结构允许DI?如何在动态用户控件中注入属性?我应该使用构造函数注入吗?

我正在使用Autofac,但我认为这个问题与IoC无关。

1 个答案:

答案 0 :(得分:3)

你走在正确的轨道上。我通常创建一个继承自 UserControl BaseUserControl 类。然后从此 BaseUserControl 类继承所有 UserControls

将所有必需的依赖项放在 BaseUserControl 类中。

public class BaseUserControl : UserControl
{
    public ISomeService SomeService { get; set; }
    public IOtherService OtherService { get; set; }

    public BaseUserControl()
    {
        var cpa = (IContainerProviderAccessor)
            HttpContext.Current.ApplicationInstance;
        var cp = cpa.ContainerProvider;
        cp.RequestLifetime.InjectProperties(this);
    }
}

您可能认为它有点浪费,因为并非所有用户控件都使用所有依赖项。

Mark Seemann在.NET的依赖注入一书中指出,依赖注入速度非常快,从来都不是问题。如果您认为您的应用程序很慢,那么它将来自您代码的其他位置(而不是依赖注入)。

如果您想使用构造函数注入,请查看此answer