Авто проводка Собственности у меня не работает - PullRequest
0 голосов
/ 01 апреля 2010

В своем проекте Asp.Net я хочу использовать свойство Auto-wiring, например для моего 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));
        }
    }
}

Однако при вызове в унаследованном элементе управления логгером является ноль. Я проверил контейнер, и он определенно установлен, как показано выше. Ниже приведена настройка, которая вызывается из Global.asax.

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

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

Спасибо за любой совет, совет? X.

Обновление
- Я не упоминал ранее, но его веб-формы Asp.Net 3.5.
- Я не вижу, что мне не хватает. Я думаю, это может быть потому, что инъекция вовлекается позже в процесс и не устанавливается в запрошенном классе.

Ссылка на desc. использования: http://structuremap.github.com/structuremap/ConstructorAndSetterInjection.htm#section7

Ответы [ 2 ]

0 голосов
/ 01 апреля 2010

Дайте что-то подобное этому.

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

Ознакомьтесь с другим моим ответом на StackOverflow, в котором обсуждается использование StructureMap для автоматического ведения журнала .

0 голосов
/ 01 апреля 2010

Где вы фактически устанавливаете свойство CLogger в пользовательском элементе управления? Кроме того, если вы хотите использовать один регистратор на странице, вы можете попросить пользователя cotnrol сделать:

public ILogger CLogger
{
  get
  {
    if (this.Page is PageBase)
       return ((PageBase)this.Page).Logger;
    else
       return null;
  }
}
...