2013-02-04 5 views
2

Я пытаюсь сделать условное связывание с тем, действительно ли я внутри именованной области.Ninject NamedScope Условные привязки

Мой интерфейс ILogger - используя поведение по умолчанию для расширения Ninject Logger, мы вносим в каждый класс реализаторы регистратора конкретных типов. Однако, в одной части системы, мы хотим, чтобы экземпляр регистратор сферы ширины, который генерируется и утилизирован с временем жизни NamedScope ...

В настоящее время (в основном) мы имеем это:

Bind<IEventViewModel>().To<EventViewModel>().DefinesNamedScope("Event").Named("Event"); 
Bind<IEventChild>().To<EventChild>().InNamedScope("Event"); 
Bind<Ninject.Extensions.Logging.ILogger>().To<EventWideLogger>().WhenAnyAnchestorNamed("Event").InEventScope(); 

Однако то, что я действительно хочу это:

Bind<IEventViewModel>().To<EventViewModel>().DefinesNamedScope("Event"); 
Bind<IEventChild>().To<EventChild>().InNamedScope("Event"); 
Bind<Ninject.Extensions.Logging.ILogger>().To<EventWideLogger>().WhenInNamedScope("Event").InEventScope(); 

Как это позволило бы изменения объекта определения области видимости событий и сохранить такое же поведение.

Я попытался это, но безрезультатно:

public static class WhenEx 
{ 
    public static IBindingInNamedWithOrOnSyntax<T> WhenInNamedScoped<T>(this IBindingWhenSyntax<T> binding, string scopeName) 
    { 
     return binding.When(req => req.IsInNamedScope(scopeName)); 
    } 

    public static bool IsInNamedScope(this IRequest req, string scopeName) 
    { 
     if (req.ParentContext != null && req.ParentContext.Parameters.OfType<NamedScopeParameter>().SingleOrDefault(parameter => parameter.Name == scopeName) != null) 
      return true; 

     return req.ParentRequest != null && req.ParentRequest.IsInNamedScope(scopeName); 
    } 
} 
+2

Я не» почему это не должно работать. Можете ли вы опубликовать информацию об активации ActivationException? –

+0

Совершенно верно - по какой-то неизвестной причине моя первоначальная попытка не сработала. Когда я снова попытался, он, похоже, работал по своему желанию. Спасибо! – jamespconnor

ответ

0

После приглашения повторить от Remo (Thankyou), мой код, как описано в начальном посте делает работу:

Bind<IEventViewModel>().To<EventViewModel>().DefinesNamedScope("Event"); 
Bind<IEventChild>().To<EventChild>().InNamedScope("Event"); 
Bind<Ninject.Extensions.Logging.ILogger>().To<EventWideLogger>().WhenInNamedScope("Event").InNamedScope("Event"); 

public static class WhenEx 
{ 
    public static IBindingInNamedWithOrOnSyntax<T> WhenInNamedScoped<T>(this IBindingWhenSyntax<T> binding, string scopeName) 
    { 
     return binding.When(req => req.IsInNamedScope(scopeName)); 
    } 

    public static bool IsInNamedScope(this IRequest req, string scopeName) 
    { 
     if (req.ParentContext != null && req.ParentContext.Parameters.OfType<NamedScopeParameter>().SingleOrDefault(parameter => parameter.Name == scopeName) != null) 
      return true; 

     return req.ParentRequest != null && req.ParentRequest.IsInNamedScope(scopeName); 
    } 
}