簡體   English   中英

在帶有.NET MVC的大型CRUD視圖中使用IoC和Repository Pattern

[英]Using IoC with Repository Pattern in a large CRUD view with .NET MVC

我有一個大視圖,有大約7個下拉到不同的模型...所以,在我的控制器的構造函數中,我有9個IRepository,就像這樣:

public CrudController(IRepository<Class1> class1Rep, IRepository<Class2> class2Rep,  ... 
IRepository<Class9> class9Rep)
{
    this.class1Rep = class1Rep;
   ...
    this.class9Rep = class9Rep;
}

所以,我可以使用所有必要的數據填充我的ViewModel ...

這是正確的方法嗎? 我正在使用Ninject ...

謝謝

您可以傳遞單個工作單元實例,而不是傳遞多個存儲庫。 訣竅是正確實現它,這里有一個:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net- MVC應用程序

(UoW部分在最后的某處開始)

仍然缺少的是你有一個uow接口和多個實現。 例如,實體框架工作單元具有注入的內容,以便它可以將上下文傳遞到存儲庫。 內存工作單元可以具有其他依賴性等。

最終,您的IoC容器只能解析工作單元。

一個簡單的答案是簡單地創建一個包含所有存儲庫的包裝類,然后只需要傳遞包裝類。

但是,大多數純粹主義者會說,如果你有那么多的存儲庫,你可能違反了單一責任原則,並且應該將功能分解為其他類。

看起來違反了SRP。 每個View Model是否需要所有存儲庫? 一些ViewModels只使用一對嗎? 你在做其他復雜的工作來創建ViewModel嗎? 如果是這樣,我將抽象ViewModel構造的一般概念,並理想地使用類似Automapper的東西來刪除任何映射。

我們使用IModelEnricher<T>抽象填充選擇列表和其他復雜工作的概念,其中T是ViewModel。 IModelEnricher<T>定義了一個Enrich方法,它接受T ViewModel的一個實例並返回一個實例T.在Enrich方法中,你需要做任何聰明的工作。 如果你需要一個ViewModel的兩個存儲庫,那么你只是將它們注入你的IModelEnricher<T>的構造函數中

我們自動使用IModelEnricher來豐富從Action結果返回的ViewModels。 我們總是將域模型自動化到同一管道中的ViewModel。 大多數Get控制器操作都是單行代碼,因為Automapper處理將Domain Model轉換為ViewModel並且richher會執行任何其他操作。

retrun AutoMappedView<AConcreteViewModel>(repository.Find(id))

如果發現了一類implemeting IModelEnricher AConcreteViewModel它會被調用,完成工作,如

    public class AConcreteViewModelEnricher:IModelEnricher<AConcreteViewModel>{

    AConcreteViewModelEnricher(Repo1 repo1, Reop2 rep2){
........
}

    AConcreteViewModel Enrich(AConcreteViewModel model){
           //Do stuff with repo etc and 
            return model
    }
}

請參閱我對您關於跌落的其他問題的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM