在MVC3應用程序與Ninject.MVC 2.2.0.3(after merge),而不是直接向控制器注入repostories我試圖做一個服務層包含businesslogic並注入在那裏的倉庫。我將ninject-DependencyResolver作爲動態對象傳遞給服務層(因爲我不想引用mvc或ninject)。然後我調用GetService來獲取存儲庫,並使用我在NinjectHttpApplicationModule中指定的綁定和生命週期。編輯:總之,它失敗了。Ninject.MVC3,將DependencyResolver傳遞給服務層?
在這種情況下,IoC容器如何傳遞給服務層? (不同的方法也非常受歡迎。)
編輯:下面是一個例子來說明我如何理解答案和評論。
我應該避免服務定位器(anti-)pattern,而是使用依賴注入。因此,可以說我想爲Northwind的產品和類別創建一個管理站點。根據表定義創建模型,存儲庫,服務,控制器和視圖。這些服務直接調用存儲庫,在那裏沒有邏輯。我有支柱功能和視圖顯示原始數據。通過構造注入兩層
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ICategoryRepository>().To<CategoryRepository>();
kernel.Bind<IProductRepository>().To<ProductRepository>();
}
庫-實例由ninject創建,在ProductController的:這些綁定被配置用於NinjectMVC3
private readonly ProductsService _productsService;
public ProductController(ProductsService productsService)
{
// Trimmed for this post: nullchecks with throw ArgumentNullException
_productsService = productsService;
}
和ProductsService:
protected readonly IProductRepository _productRepository;
public ProductsService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
我現在不需要分離服務,但已經準備好模擬分貝。
要顯示在產品/編輯類別的下拉我讓持有的類別,除了產品一個ViewModel:
public class ProductViewModel
{
public Product Product { get; set; }
public IEnumerable<Category> Categories { get; set; }
}
的ProductsService現在需要一個CategoriesRepository創建它。
private readonly ICategoryRepository _categoryRepository;
// Changed constructor to take the additional repository
public ProductsServiceEx(IProductRepository productRepository,
ICategoryRepository categoryRepository)
{
_productRepository = productRepository;
_categoryRepository = categoryRepository;
}
public ProductViewModel GetProductViewModel(int id)
{
return new ProductViewModel
{
Product = _productRepository.GetById(id),
Categories = _categoryRepository.GetAll().ToArray(),
};
}
我改變GET編輯-行動return View(_productsService.GetProductViewModel(id));
和編輯視圖顯示一個下拉菜單:
@model Northwind.BLL.ProductViewModel
...
@Html.DropDownListFor(pvm => pvm.Product.CategoryId, Model.Categories
.Select(c => new SelectListItem{Text = c.Name, Value = c.Id.ToString(), Selected = c.Id == Model.Product.CategoryId}))
一個小問題這一點,和我之所以與服務定位誤入歧途是否ProductController中的其他操作方法都不需要categories-repository。除非需要,否則我覺得創建它是浪費和不合邏輯的。我錯過了什麼嗎?
相關:http://stackoverflow.com/questions/2386487/is-it-better-to-create-a-singleton -to-access-unity-container-or-pass-it-through-t – 2011-03-01 08:46:11
謝謝。我沒有意識到我描述了服務定位器。 – Grastveit 2011-03-01 23:49:30