3

我ProductController.cs如何將控制器的動作參數傳遞給Ninject混凝土類型?

namespace AmazonProductAdvertisingAPI.WebUI.Controllers 
    { 
     public class ProductController : Controller 
     { 

      public ProductController(IProductCollection productCollection) 
      { 
       _productCollection = productCollection; 
      } 

      public static string Title 
      { 
       get 
       { 
        return _title; 
       } 
       set 
       { 
        _title = value; 
       } 
      } 
      public static int PageNumber 
      { 
       get 
       { 
        return _pageNumber; 
       } 
       set 
       { 
        _pageNumber = value; 
       } 
      } 
      public static int ItemsPerPage 
      { 
       get 
       { 
        return _itemsPerPage; 
       } 
       set 
       { 
        _itemsPerPage = value; 
       } 
      } 
      // GET: Product 
      public ActionResult List(int page = 1, string search = null) 
      { 

       ProductListViewModel model = new ProductListViewModel 
       { 
        Products = _productCollection.Products 
               .OrderBy(product => product.Title) 
               .Skip((page - 1) * pageSize) 
               .Take(pageSize), 
        PagingInfo = new PagingInfo 
        { 
         CurrentPage = page, 
         ItemsPerPage = pageSize, 
         TotalItems = _productCollection.Products.Count() 
        } 
       }; 
       return View(model); 
      } 
     } 
    } 

NinjectDependencyResolver.cs

namespace AmazonProductAdvertisingAPI.WebUI.Infrastructure 
{ 
    public class NinjectDependencyResolver : IDependencyResolver 
    { 
     private IKernel kernel; 

     public NinjectDependencyResolver(IKernel kernelParam) 
     { 
      kernel = kernelParam; 
      AddBindings(); 
     } 
     public object GetService(Type serviceType) 
     { 
      return kernel.TryGet(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return kernel.GetAll(serviceType); 
     } 

     private void AddBindings() 
      { 
       // Create dependency here 

       kernel.Bind<IProductCollection>().To<AmazonProductCollection>() 
               .WhenInjectedInto<ProductController>() 
               .WithConstructorArgument("title", ProductController.Title) 
               .WithConstructorArgument("pageNumber", ProductController.PageNumber) 
               .WithConstructorArgument("itemsPerPage", ProductController.ItemsPerPage); 
      } 
     } 
    } 

AmazonProductCollection類具有構造函數:

public AmazonProductCollection(string title, int pageNumber, int itemsPerPage) 

我想這AmazonProductCollection擺脫動作列表參數自己的參數從產品控制器,因爲當用戶填寫TextBoxt並點擊按鈕「搜索」時,會得到一些信息html-view表單。例如,我想從操作List中使用參數字符串「search」,並將其作爲構造函數參數「title」傳遞給AmazonProductCollection。

我看過這篇文章:How to pass parameters to a transient object created by Ninject?,但我不明白在我的情況下如何創建相同的東西。

有人可以幫我與Ninject嗎?

回答

4

一個解決方案是使用工廠。

工廠接口會是這個樣子:

public interface IAmazonProductCollectionFactory 
{ 
    AmazonProductCollection Create(string title, int pageNumber, int itemsPerPage); 
} 

這種接口將住在同一個項目中,控制器(MVC的項目)。

這樣的工廠的實施將是這樣的:

public class AmazonProductCollectionFactory : IAmazonProductCollectionFactory 
{ 
    private readonly IResolutionRoot m_ResolutionRoot; 

    public AmazonProductCollectionFactory (IResolutionRoot resolution_root) 
    { 
     m_ResolutionRoot = resolution_root; 
    } 

    public AmazonProductCollection Create(string title, int pageNumber, int itemsPerPage) 
    { 
     return resolution_root.Get<AmazonProductCollection>(
      new ConstructorArgument("title", title), 
      new ConstructorArgument("pageNumber", pageNumber), 
      new ConstructorArgument("itemsPerPage", pageNumber)); 
    } 
} 

AmazonProductCollectionFactory將住在Composition Root項目中。在你的情況下,這可能是相同的MVC項目。請注意,有這樣的工廠取決於IResolutionRoot除組成根外的任何地方都是服務地點的例子,其中is considered an anti-pattern

現在,而不是IProductCollection,你需要注入IAmazonProductCollectionFactoryProductController的構造,讓List動作用它來創建一個AmazonProductCollection情況是這樣的:

var productCollection = factory.Create(...); 

其中factory是的名稱您用來存儲注入的實例變量IAmazonProductCollectionFactory

不要忘記用Ninject容器註冊IAmazonProductCollectionFactory

請注意,您應該考慮創建一個符合List操作要求的服務。例如,您可以將整個搜索邏輯封裝在知道如何執行搜索的服務中,並讓這樣的服務通過抽象工廠來創建AmazonProductCollection。然後,不是將工廠注入控制器,而是將服務注入控制器。

+0

哪裏更好地把這個工廠班?在域項目或mvc?你能指定更好用於對流的文件夾嗎? –

+1

工廠應該生活在組成的根。這儘可能接近應用程序入口點。 MVC項目是一個合適的地方。你在哪裏擁有'NinjectDependencyResolver'類?您可以將工廠放在該課程的同一文件夾中。 –

+0

謝謝!你的回答可以幫助我! –

相關問題