2012-04-03 13 views
18

Tôi đã cố gắng cho các lứa tuổi để tìm ra điều này. khi tôi cố gắng để ràng buộc lớp học của tôi với một đánh chặn tôi nhận được ngoại lệ sau đây trên dòngKhông thể nhận Ninject.Extensions.Interception làm việc

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

Lỗi tải Ninject phần IAdviceFactory. Không có thành phần như vậy đã được đăng ký vào bình chứa thành phần của hạt nhân

tôi đã cố gắng có và không có LoadExtensions, Với khoảng với việc sử dụng một mô-đun để thiết lập các ràng buộc của tôi và cố gắng cuối cùng của tôi trông như thế này

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; 
    } 
} 

Logger Thuộc tính của tôi trông giống như

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

Và đánh chặn này của tôi như thế này

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); 
    } 
} 

Trả lời

25

Nhiều khả năng bạn không triển khai Ninject.Extensions.Interception.DynamicProxy hoặc Ninject.Extensions.Interception.Linfu cùng với đơn đăng ký của bạn [và Ninject.Extensions.Interception]. Bạn phải chọn chính xác một trong số họ.

Với mã như bạn có ngay bây giờ (LoadExtensions=false) nó sẽ không nhận được thư viện chặn cụ thể - bạn nên loại bỏ điều đó và tải tiện ích mở rộng bình thường sẽ nối phần mở rộng đó vào hạt nhân. nhặt nó lên.

+0

Tôi đã cố gắng lấy chúng bằng Nuget, bạn có cần cả hai hoặc chỉ một? –

+2

Cảm ơn điều đó. Tại sao gói nuget chỉ thêm một trong số này làm Mặc định? từ nhà phát triển sử dụng nó nó làm cho không có sự khác biệt những gì nó sử dụng. –

+0

Hữu ích để biết, tôi đã cố gắng để làm cho nó hoạt động bằng cách sử dụng LoadExtensions = false và không thể có được một thể hiện của bất cứ điều gì từ hạt nhân – user1039513

0

Ngoài Remo Gloor's answer mà chỉ cho tôi hướng tới việc thêm các gói NuGet cho Ninject.Extensions.Interception.DynamicProxy, tôi vẫn tiếp tục nhận được ngoại lệ giống như OP, cho đến khi tôi tự nạp một DynamicProxyModule - các FuncModule được bằng tay nạp là tốt, để làm việc xung quanh một lỗi tương tự liên quan đến tiện ích mở rộng của nhà máy:

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