如何使用Microsoft Unity 2.0注入页面类的依赖?

时间:2011-09-16 11:12:12

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

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

    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会被注入,但实际行为是它总是为空。

如何正确配置?

由于

3 个答案:

答案 0 :(得分:0)

使用ASP.NET Page Factory。

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

亚伊尔

答案 1 :(得分:0)

我创建了一个基页类,其中属性依赖注入发生在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);
    }
    }

无需单独的处理程序。

答案 2 :(得分:0)

您可以编写HttpModule并处理每个请求和创建页面后触发的一个预请求事件。这是您注入房产所需的地点。