2011-05-06 34 views
7

Vì vậy, tôi đã chơi xung quanh với bản phát hành mới nhất của WCF Web API và quyết định tôi muốn đi sâu vào triển khai Ninject với nó.Thiết lập Ninject với WCF Web API mới

Dựa tắt những gì tôi đã đọc tôi cần phải thực hiện các IResourceFactory giao diện mà đòi hỏi các phương pháp sau:

public object GetInstance(System.Type serviceType, 
           System.ServiceModel.InstanceContext instanceContext, 
           System.Net.Http.HttpRequestMessage request); 

    public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, 
           object service); 

Vì vậy, gà tôi bị trầy xước sau ra:

public class NinjectResourceFactory : IResourceFactory 
{ 
    private readonly IKernel _kernel; 

    public NinjectResourceFactory() 
    { 
     var modules = new INinjectModule[] 
          { 
           new ServiceDIModule(), //Service Layer Module 
           new RepositoryDIModule(), //Repo Layer Module 
           new DataServiceDIModule() 
          }; 

     _kernel = new StandardKernel(modules); 
    } 

    #region IResourceFactory Members 

    public object GetInstance(Type serviceType, 
           InstanceContext instanceContext, 
           HttpRequestMessage request) 
    { 
     return Resolve(serviceType); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object service) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 

    private object Resolve(Type type) 
    { 
     return _kernel.Get(type); 
    } 

    //private T Resolve<T>() 
    //{ 
    // return _kernel.Get<T>(); 
    //} 

    //private T Resolve<T>(string name) 
    //{ 
    // return _kernel.Get<T>(metaData => metaData.Has(name)); 
    // return _kernel.Get<T>().Equals(With.Parameters. 
    //         ContextVariable("name", name)); 
    //} 
} 

và có dây nó lên với

var configuration = HttpHostConfiguration.Create().SetResourceFactory(new NinjectResourceFactory()); 
    RouteTable.Routes.MapServiceRoute<StateProvinceResource>("States", configuration); 

Thật ngạc nhiên, điều này dường như hiệu quả. Phương thức tài nguyên đầu tiên mà tôi đã tạo để phân phối danh sách các tiểu bang/tỉnh tạo ra kết quả đầu ra với HTTP 200 OK.

Vì vậy, đối với câu hỏi. Có cách nào sạch hơn cách viết nhà máy này không? Tôi thực sự lúng túng thông qua nó và nó chỉ cảm thấy không đúng. Tôi cảm thấy như tôi đang thiếu một cái gì đó rõ ràng nhìn chằm chằm vào mặt tôi. Các hack tôi thực hiện trong phương pháp Resolve mới cảm thấy đặc biệt là bẩn vì vậy tôi figured tôi muốn gõ vào những người có kinh nghiệm hơn để thắt chặt này lên. Có ai khác đã triển khai Ninject với WCF Web API và triển khai một giải pháp sạch hơn không?

Cảm ơn mọi đầu vào!

+0

điều này có vẻ tương tự như điều tôi đã làm với structuremap. đi qua các đối tượng luôn luôn cảm thấy một chút hacky, nhưng nếu những gì khuôn khổ của nó mang đến cho bạn, sự lựa chọn là có, bên cạnh việc lăn của riêng bạn tất nhiên. –

Trả lời

0

Bạn có thể triển khai bằng cách chuyển Kernel từ phạm vi ứng dụng.

public class NinjectResourceFactory : IResourceFactory 
{ 
    private readonly IKernel _kernel; 

    public NinjectResourceFactory(IKernel kernel) 
    { 
     _kernel = kernel; 
    } 

    public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request) 
    { 
     return _kernel.Get(serviceType); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object service) 
    { 
     // no op 
    } 
} 
+0

Có, làm sạch nhà máy một chút công bằng. Phần tôi đã thực sự cố gắng để không ở trên là phương pháp Resolve được dồn vào một đối tượng thay vì một kết quả đánh máy, nhưng tôi đoán thực hiện này sẽ phải làm cho đến khi/nếu đội Microsoft sửa đổi giá trị trả lại. – Khepri

+0

IResourceFactory đến từ đâu? Đây có phải là giao diện Web API không? Tôi đang cố gắng để có được điều này để làm việc với Preview 5 của Web API mà không có bất kỳ may mắn? Bạn đã sử dụng phần mở rộng Ninject.MVC hoặc WCF hay cả hai? Cảm ơn. – Cragly

+0

@ Phản hồi câu trả lời này là dành cho Xem trước 3 mà tôi nghĩ, không áp dụng cho Bản xem trước 5 – Jonathan

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