0

在我的 Asp.Net 项目中,我想使用 Property Auto-wiring,例如用于我的 ILogger。基本上,我将它作为 Property 放入需要使用它的类中。如下所示。

public class UserControlBase : UserControl
{
    public ILogger CLogger { get; set; }
    ....
}


public partial class IPTracking : UserControlBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            //it works
            ILogger logger = ObjectFactory.GetInstance<ILogger>();
            logger.LogInfo(string.Format("Client IP: {0}", ip));
            //it does not work
            CLogger.LogInfo(string.Format("Client IP: {0}", ip));
        }
    }
}

但是,在继承控件中调用时,记录器为空。我检查了容器,它确实设置为如上面的实现所示。下面是从 Global.asax 调用的设置。

    public static void SetupForIoC()
    {
        Debug.WriteLine("SetupForIoC");
        ObjectFactory.Initialize(x =>
        {
            x.FillAllPropertiesOfType<ILogger>().Use<EntLibLogger>();
        });

        Debug.WriteLine(ObjectFactory.WhatDoIHave());
    }

感谢您的任何建议,提示?X。

更新
- 我之前没有提到,但它的 Asp.Net webforms 3.5。
- 我看不到我错过了什么。我想这可能是因为注入在稍后的过程中涉及并且没有在请求的类中设置。

链接到描述。用法:http ://structuremap.github.com/structuremap/ConstructorAndSetterInjection.htm#section7

4

2 回答 2

0

您实际上在哪里设置用户控件上的 CLogger 属性?此外,如果您想在页面中使用一个记录器,您可以让用户控制:

public ILogger CLogger
{
  get
  {
    if (this.Page is PageBase)
       return ((PageBase)this.Page).Logger;
    else
       return null;
  }
}
于 2010-04-01T12:08:11.833 回答
0

试一试这样的事情。

FillAllPropertiesOfType<ILogger>().AlwaysUnique().Use(s => s.ParentType == null ? new Log4NetLogger(s.BuildStack.Current.ConcreteType) : new Log4NetLogger((s.ParentType)));

查看我的另一个 StackOverflow 答案,其中讨论了使用 StructureMap 来自动连接记录器

于 2010-04-01T14:13:24.320 回答