2010-04-01 5 views
0

В моем проекте 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)); 
     } 
    } 
} 

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

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

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

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

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

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

ответ

0

Дайте что-нибудь подобное.

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

Заканчивать другой ответ StackOverflow я имею в котором обсуждается using StructureMap to auto wire loggers.

+0

Прошу прощения, я не понимаю. Требуется ли предлагаемое решение для создания конкретного конструктора? У меня в настоящее время только параметр less меньше конструктора для ведения журнала (EntLibLogger). Существует ли конкретная потребность в инъекции требуемого класса в конкретный контекст? –

+0

Логгер log4net, который я использовал, может принимать тип в качестве области ведения журнала. Приятно, что ваши регистраторы часто бывают в ваших классах. Делает его очень быстрым, чтобы получить контекст проблемы. Не знаете, как вы просматривали регистраторы. Если вам не нужно контролировать строительство вашего регистратора, FillAllPropertiesOfType 10 должен делать то, что вам нужно. – KevM

0

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

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

Дело в том, что я не хочу его устанавливать. Я хочу сделать это для меня. По данным StructureMap, он должен работать таким образом. Сам регистратор просто используется в коде для простого ведения журнала (ошибка, информация, предупреждения) –

Смежные вопросы