2012-11-14 39 views
5

Dự án asp.net WebApi của tôi bao gồm nhiều tập hợp cho Dịch vụ, Lõi và Truy cập Dữ liệu. Trong một nỗ lực để sử dụng Ninject như container DI của tôi trong dự án, tôi đã thêm gói Ninject.Web.Common từ NuGet. Sau đó, tôi đã triển khai IDependencyResolver là:Ninject 3 - Does BeginBlock() ghi đè InRequestScope trong asp.net WebAPI?

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver 
{ 
    readonly IKernel kernel; 

    public NinjectDependencyResolver(IKernel kernel) : base(kernel) 
    { 
     this.kernel = kernel; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new NinjectDependencyScope(this.kernel.BeginBlock()); 
    } 
} 

public class NinjectDependencyScope : IDependencyScope 
{ 
    IResolutionRoot resolver; 

    public NinjectDependencyScope(IResolutionRoot resolver) 
    { 
     this.resolver = resolver; 
    } 

    public object GetService(System.Type serviceType) 
    { 
     if (resolver == null) 
      throw new ObjectDisposedException("this", "This scope has been disposed"); 

     var resolved = this.resolver.Get(serviceType); 
     return resolved; 
    } 

    public System.Collections.Generic.IEnumerable<object> GetServices(System.Type serviceType) 
    { 
     if (resolver == null) 
      throw new ObjectDisposedException("this", "This scope has been disposed"); 

     return this.resolver.GetAll(serviceType); 
    } 

    public void Dispose() 
    { 
     IDisposable disposable = resolver as IDisposable; 
     if (disposable != null) 
      disposable.Dispose(); 

     resolver = null; 
    } 
} 

Đây là Ninject.Web.Common.cs của tôi.

public static class NinjectWebCommon 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    /// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    /// <summary> 
    /// Stops the application. 
    /// </summary> 
    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 
     RegisterServices(kernel); 

     GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
     return kernel; 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind(x => 
      x.FromAssembliesMatching("WebApiTest.DataAccess.dll") 
      .SelectAllClasses() 
      .BindAllInterfaces() 
      .Configure(config => config.InRequestScope())); 

     kernel.Bind(x => 
      x.FromAssembliesMatching("WebApiTest.*.dll") 
      .SelectAllClasses() 
      .BindAllInterfaces() 
      .Configure(config => config.InTransientScope())); 
    }   
} 

Câu hỏi của tôi là về mã trong NinjectDependencyResolver -> Phương pháp BeginScope(): trở lại mới NinjectDependencyScope (this.kernel.BeginBlock());

Tôi muốn có kho lưu trữ của tôi (được triển khai trong WebApiTest.DataAccess.dll) được yêu cầu phạm vi. Tôi đã xem qua số post từ Nate Kohari. Tôi nhận ra bài viết cũ nhưng mô tả về các khối kích hoạt làm cho tôi tự hỏi nếu đó vẫn là việc thực hiện hiện tại.

Có một cách xử lý cuối cùng trong phạm vi Ninject2, thông qua các khối kích hoạt. Các khối là> một cách để ghi đè phạm vi được khai báo trên một ràng buộc, và thay vào đó kết hợp các cá thể được kích hoạt với chính khối đó. ...

Vì vậy, phạm vi thực tế của kho lưu trữ của tôi là gì?

Ngoài ra, âm thanh với tôi rằng việc sử dụng các BeginBlock() là không bắt buộc nhưng khi tôi gỡ bỏ nó, cuộc gọi đầu tiên để điều khiển thành công nhưng bất kỳ cuộc gọi tiếp theo ném ngoại lệ:

Ninject phần ICache Không như thành phần đã được đăng ký trong thùng chứa thành phần của hạt nhân

TẠI SAO ??

Trả lời

13

Còn bây giờ sử dụng này NinjectDependencyResolver và điều này NinjectDependencyScope triển khai

+0

Tôi đang sử dụng chúng. bạn có ý nghĩa gì chính xác? –

+0

Bạn không. Nhìn vào việc triển khai. Chúng tôi đã tạo ra chúng trong chuỗi này: https://github.com/ninject/Ninject.Web.WebApi/pull/1 –

+0

Ian, cảm ơn. Đã không ngay lập tức khám phá các liên kết trong câu trả lời của bạn. Là sự hiểu biết của tôi đúng với việc thực hiện của tôi, BeginBlock() sẽ ghi đè phạm vi Singleton? –

1

Để sử dụng phụ thuộc vào phạm vi yêu cầu không đặt chúng bằng cách sử dụng Ninject của InRequestScope() nhưng kéo chúng ra khỏi Yêu cầu sử dụng GetDependencyScope()

Tôi đặt cùng một bài đăng trên blog về điều đó http://www.strathweb.com/2012/11/asp-net-web-api-and-dependencies-in-request-scope/

+0

Filip, cảm ơn bài đăng trên blog. Thật tuyệt. Tuy nhiên, UoW là trừu tượng ra khỏi bộ điều khiển và tôi không muốn mang theo bối cảnh tất cả các con đường xuống. Có suy nghĩ gì không? –

Các vấn đề liên quan