2012-04-03 22 views
18

Od dawna próbuję to zrozumieć. gdy próbuję powiązać moją klasę z kolektora Dostaję następujący wyjątek na liniiNie można pobrać pliku Ninject.Extensions.Interception working

Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>(); 

Error loading Ninject komponent IAdviceFactory. Nie taki element został zarejestrowany w składniku pojemnika jądra

Próbowałem zi bez LoadExtensions, zo z użyciem modułu skonfigurować moje powiązania i moją ostatnią próbę wygląda to

internal class AppConfiguration 
{ 

    internal AppConfiguration() 
    { 
     var settings = new NinjectSettings() { LoadExtensions = false }; 
     Kernel = new StandardKernel(settings); 
     Load(); 
    } 

    internal StandardKernel Kernel { get; set; } 

    public static AppConfiguration Instance 
    { 
     get { return _instance ?? (_instance = new AppConfiguration()); } 
    } 

    private static AppConfiguration _instance; 

    private void Load() 
    { 
     Kernel.Bind<ILoggerAspect>().To<Log4NetAspect>().InSingletonScope(); 
     Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>(); 
    } 

    internal static StandardKernel Resolver() 
    { 
     return Instance.Kernel; 
    } 
} 

Moja Logger Atrybut wygląda to

public class LogAttribute : InterceptAttribute 
{ 
    public override IInterceptor CreateInterceptor(IProxyRequest request) 
    { 
     return request.Context.Kernel.Get<ILoggerAspect>(); 
    } 
} 

i mój kolektora jak ten

public class Log4NetAspect : SimpleInterceptor, ILoggerAspect 
{ 
    protected override void BeforeInvoke(IInvocation invocation) 
    { 
     Debug.WriteLine("Running " + invocation.ReturnValue); 
     base.BeforeInvoke(invocation); 
    } 

    public new void Intercept(IInvocation invocation) 
    { 
     try 
     { 
      base.Intercept(invocation); 
     } 
     catch (Exception e) 
     { 
      Debug.WriteLine("Exception: " + e.Message); 
     } 
    } 

    protected override void AfterInvoke(IInvocation invocation) 
    { 
     Debug.WriteLine("After Method"); 
     base.AfterInvoke(invocation); 
    } 
} 

Odpowiedz

25

Najprawdopodobniej nie wdrożyłeś Ninject.Extensions.Interception.DynamicProxy lub Ninject.Extensions.Interception.Linfu obok aplikacji [i Ninject.Extensions.Interception]. Musisz wybrać dokładnie jedną z nich.

Z kodem, jaki masz teraz (LoadExtensions=false), nie uda się odebrać konkretnej biblioteki przechwytywania - powinieneś ją usunąć, a normalne ładowanie rozszerzeń powinno łączyć rozszerzenie z jądrem w momencie tworzenia bitów przechwytywania do Podnieś to.

+0

Próbowałem zabrać je z Nuget, czy potrzebujesz obu, czy tylko jednego? –

+2

Dzięki, że to było to. Dlaczego pakiet nuget nie dodaje jednego z nich jako domyślnego? od programisty, który go używa, nie ma znaczenia, z czego korzysta. –

+0

Przydatne, aby wiedzieć, próbowałem go do pracy przy użyciu LoadExtensions = false i nie można uzyskać wystąpienie czegokolwiek z jądra – user1039513

0

Oprócz Remo Gloor's answer który wskazał mi w kierunku dodanie pakietu Nuget dla Ninject.Extensions.Interception.DynamicProxy, Ciągle otrzymuję ten sam wyjątek jak PO, dopóki ręcznie ładowane DynamicProxyModule - w FuncModule jest ręcznie ładowane, jak również, aby obejść podobnego błędu z rozszerzeniem fabrycznym:

_kernel = new StandardKernel(
    new NinjectSettings{LoadExtensions = true}, 
    new FuncModule(), 
    new DynamicProxyModule()); // <~ this is what fixed it 
Powiązane problemy