0

私の Asp.Net プロジェクトでは、ILogger などにプロパティの自動配線を使用したいと考えています。基本的に、使用する必要があるクラスにプロパティとして配置しました。以下のように。

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));
        }
    }
}

ただし、継承されたコントロールで呼び出す場合、logger は null です。コンテナーを確認したところ、上記の実装が示すように確実に設定されています。以下は Global.asax から呼び出す設定です。

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

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

アドバイスありがとう、ヒント?バツ。

更新:
- 前に言及しませんでしたが、その Asp.Net webforms 3.5.
- 欠けているものが見えません。インジェクションがプロセスの後半に関与し、要求されたクラスに設定されなかったことが原因である可能性があると思います。

説明へのリンク。使用法: http://structuremap.github.com/structuremap/ConstructorAndSetterInjection.htm#section7

4

2 に答える 2

0

このようなものを試してみてください。

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

StructureMapを使用してロガーを自動配線する方法について説明している別のStackOverflowの回答を確認してください。

于 2010-04-01T14:13:24.320 に答える
0

ユーザー コントロールのどこで CLogger プロパティを実際に設定しますか? また、ページ内で 1 つのロガーを使用したい場合は、ユーザー コントロールに次のことをさせることができます。

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