2013-07-19 60 views
0

我有一個項目,有三層。ASP.NET MVC適當的應用程序和依賴注入分層

一日是DAL

第二是域

第三是介紹

我創造了我的領域層(ICategoryRepository)的接口下面是代碼

public interface ICategoryRepository 
{ 
    List<CategoryDTO> GetCategory(); 
} 

我在我的DAL中創建了一個類來在我的域中實現ICategoryRepository。

public class CategoryRepository : ICategoryRepository 
{      
    BookInfoContext _context; 

    public List<CategoryDTO> GetCategory() 
    { 
     _context = new BookInfoContext(); 

     var categoryDto = _context.Categories 
          .Select(c => new CategoryDTO 
          { 
           CategoryId = c.CategroyId, 
           CategoryName = c.CategoryName 
          }).ToList(); 
     return categoryDto; 
    } 
} 

然後,我在我的域中創建一個類,並在構造函數中傳遞ICategoryRepository作爲參數。

public class CategoryService 
{ 

    ICategoryRepository _categoryService; 

    public CategoryService(ICategoryRepository categoryService) 
    { 
     this._categoryService = categoryService; 
    } 

    public List<CategoryDTO> GetCategory() 
    { 
     return _categoryService.GetCategory(); 
    } 
} 

我這樣做來反轉控制。而不是我的域將取決於DAL我反轉控制,以便myDAL將取決於我的DOMAIN。

我的問題是,每次我在表示層調用CategoryService時,我需要傳遞ICategoryRepository作爲DAL中構造函數的參數。我不希望我的表示層依賴於我的DAL。

有什麼建議嗎?

謝謝,

回答

1

您可以使用依賴注入。在asp.net mvc中,我們有一個IDepencyResolver接口,用於注入控制器依賴關係及其依賴關係的依賴關係。要做到這一點,你需要一個容器來容易地注入你的附屬物,例如MS Unity,Ninject等等。並且註冊容器上的所有類型,知道如何解決你的依賴關係。

隨着ContainerDependencyResolver設置好的,你可以有你service的依賴上你的controller,樣品:

public class CategoryController 
{ 
    private readonly ICategoryService _categoryService; 

    // inject by constructor.. 
    public CategoryController(ICategoryService categoryService) 
    { 
     _categoryService = categoryService; 
    } 


    public ActionResult Index() 
    { 
     var categories = _categoryService.GetCategory(); 

     return View(categories); 
    } 

} 

在這種情況下,容器會看到控制器需要的服務,這種服務需要一個存儲庫。它會爲您解決所有問題,因爲您已經註冊了這些類型。

看看這篇文章: http://xhalent.wordpress.com/2011/01/17/using-unity-as-a-dependency-resolver-asp-net-mvc-3/

+0

我需要在我的categoryService改變什麼..?我嘗試該代碼,它將返回空值。我使用ninject來解決依賴關係,但當我嘗試綁定時,我得到錯誤..我綁定使用此代碼** kernel.Bind ()。(); ** – RAM

+0

我不知道ninject,但作爲任何容器,您必須註冊所有依賴項:存儲庫和服務,以便Container知道如何解析樹上的所有依賴關係:'controller' - >'service' - >'repository'。你註冊了你的倉庫嗎? –

+0

你是對的我只需要註冊我的倉庫.. kernel.Bind ()。到();
。我現在的問題是我的表示層對我的DAL有依賴性。感謝兄弟的幫助 – RAM