【问题标题】:How to Inject a Dependency to a Page Class Using Microsoft Unity 2.0?如何使用 Microsoft Unity 2.0 将依赖项注入到页面类?
【发布时间】:2011-11-18 14:52:11
【问题描述】:

我有一个具有以下属性的页面:

    public partial class CustomPage : Page
{
    [Dependency]
    public ILogger Logger { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write((this.Logger == null) ? "Not initialized" : "Initialized");
    }
}

可以看出,ILogger 是一个依赖项,应该注入到这个类中。

Unity 配置文件的配置如下:

<unity>
  <alias alias="ILogger" type="Logging.ILogger, AssemblyName" />
  <alias alias="Logger" type="Logging.Logger, AssemblyName" /> 
  <container>
    <register type="ILogger" mapTo="Logger">
      <lifetime type="singleton"/>
    </register>   
  </container>
</unity>

在我的 Global.ascx 文件中,Application_Start 事件中有以下代码:

var container = new UnityContainer();
container.LoadConfiguration();
container.Resolve<CustomPage>();

我期望的是,当 CustomPage 运行时,ILogger 会被注入,但实际行为是它始终为空。

如何正确配置?

谢谢

【问题讨论】:

    标签: asp.net dependency-injection inversion-of-control unity-container ioc-container


    【解决方案1】:

    使用 ASP.NET 页面工厂。

    您需要在您的 CustomPage 类和工厂中添加一个构造函数以传递适当的参数。

    亚尔

    【讨论】:

    • 谢谢;问题是关于属性注入而不是构造函数注入。虽然我也很想知道如何使用 Unity 配置构造函数注入。
    • 谢谢亚尔。我的页面正在使用的其他类呢?例如数据访问层、业务对象层等的依赖关系?我正在使用 MVP 模式并将所有逻辑移到一个名为 CustomPagePresenter 的演示者类中。 Logger 属性现在存在于此类中。页面实例化演示者对象。不使用 Handler 就可以将 Logger 注入到这个 Presenter 类中吗?
    【解决方案2】:

    我创建了一个基页面类,其中属性依赖注入发生在 Page_PreInit 上:

    public class BasePage<T> : Page where T: class
    {
        [Dependency]
        public ILogger Logger { get; set; }
    
        protected void Page_PreInit(object sender, EventArgs args)
        {
            ((IContainerAccessor)HttpContext.Current.ApplicationInstance).Container.BuildUp<T>(this as T);
        }
        }
    

    无需单独的处理程序。

    【讨论】:

      【解决方案3】:

      您可以编写一个 HttpModule 并处理每个请求以及在您的页面创建后触发的请求前事件之一。这是您需要注入属性的地方。

      【讨论】:

        猜你喜欢
        • 2016-09-28
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        • 2015-03-21
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 2016-01-27
        相关资源
        最近更新 更多