2013-12-19 3 views
1

Я хочу передать экземпляр кэша в качестве зависимости от одного или нескольких типов. Когда конкретный экземпляр кэша создается, ему должна быть предоставлена ​​информация о типе, который будет использовать его.Контент активирован Ninject 3

Я понимаю, что это общая задача и что зависимости от впрыскивания кеша появляются в различных вопросах/ответах; Я задаю конкретную проблему, с которой я сталкиваюсь с Ninject.

interface IMethodCache { } 

public class MethodCache : IMethodCache 
{ 
    public MethodCache(Type type) 
    { 
     // type information is used to build unique cache keys 
    } 
} 

public class CacheConsumer 
{ 
    public CacheConsumer(IMethodCache cache) { } 
} 

документация

Ninject documentation shows how to do just that (с помощью регистрации в качестве примера):

class ClassThatLogs { 
    readonly ILog _log; 
    public ClassThatLogs(ILog log){ 
     _log = log; 
    } 
} 

Bind<ILog>().ToMethod(context => LogFactory.CreateLog(context.Request.Target.Type)); 

В предыдущем примере показано, что context.Request.Target.Type будет содержать информацию о типе для типа, в котором имеет место инъекции.

Кроме того, комментарии по context.Request.Target состояние:

Получает цель, которая будет получать инъекции, если таковые имеются.

Результаты

Исходя из этого, я ожидаю увидеть информацию о экземпляре принимающем инъекции. Я устанавливаю свою привязку следующим образом:

kernel.Bind<IMethodCache>().ToMethod( 
    ctx => 
    { 
     return new MethodCache(ctx.Request.Target.Type); 
    }); 

Но результат является неожиданным.

enter image description here

Type свойство Target устанавливается к типу привязки (IMethodCache), а не "цель, которая будет получать инъекции" (CacheConsumer).

Чтобы указать его другим способом: при создании зависимостей мне нужно передать ему тип инъекции.

Я могу получить нужную информацию с помощью context.Request.Target.Member.DeclaringType. Тем не менее, я обеспокоен тем, что я не знаю последствий использования объявляющего типа и — более важно —, потому что это противоречит документации.

Вопросы

  • Am Я понимание документации правильно?
  • Если да, то что я делаю неправильно?
  • Если нет, то как я могу достичь цели передачи информации о типе в конструктор моей зависимости (кеш)?

Другие детали

  • Ninject 3.0.1.10
  • Состав корень является началом событие службы Windows,
  • Я использую StandardKernel

ответ

2

Да, кажется, что документация является неполной/неправильной в этом случае.

вы можете получить информацию о типе цели, начиная с ctx.Request.Target, но вам нужно идти «на один шаг дальше» с использованием Member и ctx.Request.Target.Member.DeclaringType, как вы уже заметили.

Так что вполне нормально использовать context.Request.Target.Member.DeclaringType на самом деле, если вы проверяете упомянутый Ninject.Extensions.Loggin вы увидите следующее в

source code:

/// <summary> 
/// Gets the logger for the specified activation context, creating it if necessary. 
/// </summary> 
/// <param name="context">The ninject creation context.</param> 
/// <returns>The newly-created logger.</returns> 
public ILogger GetLogger(IContext context) 
{ 
    return this.GetLogger(context.Request.Target.Member.DeclaringType); 
} 
Смежные вопросы