2013-04-02 42 views
6

如果我在ASP.NET MVC應用程序中使用存儲庫模式我需要DI讓程序知道,接口的類必須映射。如果我實現Unity,我需要將DAL項目添加到我的MVC項目中,然後在global.asax中註冊這些類型。ASP.NET MVC項目EF庫模式

在我的腦海裏,我覺得這是不好的DAL層的命名空間添加到MVC項目中,有一個業務層也介於兩者之間。我認爲,在業務層中注入DAL類並僅在MVC應用程序中注入業務層映射將會很美妙。

這是怎麼回事?你有什麼建議嗎?

UPDATE: 爲了明確這一點給我。在服務層中,只有DTO和用於業務和數據訪問層的DI。在服務層中,我將DTO映射到域模型。我不明白的是,我該如何調用業務層方法?

+0

使用回購並不意味着你必須使用DI--他們解決了兩個不同的問題。 –

+2

我建議讀一讀「洋蔥建築學」,我認爲這是一個很好的方法來參考項目。因爲你的用戶界面和數據訪問層在外面都是正確的,所以他們不應該有任何問題彼此引用。 – Charlino

回答

3

即使你不使用不同的服務層,就可以完成你想要的東西,這是從分離使用DI的DAL項目的MVC應用程序。

做到這一點的方法是添加幾個項目/組件在導線與您已定義的接口的特定實例的IoC容器之間。

我通常使用這種命名規則:

  • MyCompany.MyProject.Infrastructure

  • MyCompany.MyProject.Abstract

你的主要MVC項目將不得不爲參考您的抽象和基礎設施項目。您的基礎設施項目將引用Abstract和實例特定的項目,如Business和DAL項目。在Infrastructure項目中,您可以連接依賴關係。

你必須設置你的MVC項目來引導你的IoC的基礎設施組件的機制。您可以在global.asax或App_Start方法中執行該操作,並在基礎結構程序集中調用Registration類。

我們使用StructureMap,但概念是相同的。以下是一些示例代碼。

在您的MVC App中,創建一個App_Start方法來設置DI。

public static class StructuremapMvc 
{ 
    public static void Start() 
    { 

     // Create new Structuremap Controller factory so Structure map can resolve the parameter dependencies. 
     ControllerBuilder.Current.SetControllerFactory(new StructuremapControllerFactory()); 

     IContainer container = IoC.Initialize(); 

     DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); 

     GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container); 
    } 
} 

在您的基礎結構組裝中,連接相關性。

public static class IoC 
{ 
    public static IContainer Initialize() 
    { 
     ObjectFactory.Initialize(x => 
        { 
         x.Scan(scan => 
           { 
            scan.TheCallingAssembly(); 
            scan.WithDefaultConventions(); 
           }); 
         x.For<IRepositoryNum1>().Use<Num1Repository>(); 
         x.For<IRepositoryNum2>().Use<Num2Repository>(); 
         x.For<IRepositoryNum3>().Use<Num3Repository>(); 
        }); 

     return ObjectFactory.Container; 
    } 
} 
+0

好吧,這個基礎設施就像Alwyn描述的服務層,但沒有DTOs,我說得對嗎?這種方法對我來說非常好,我會測試它。 – Dominik2000

+0

是的,這種方法可以使用或不使用服務層和關聯的DTO。 – dblood

4

如果你想要務實,一個真正的三層架構需要一個服務層。服務和MVC之間是數據傳輸對象(DTO)。服務層隱藏了DAL和業務層。

如果設置了這樣的MVC本身一無所知DAL,只有的DTO和服務(合同)。

+0

這將是我的方法 –

+0

好的,我會測試這兩種方法。我會看到更適合我的東西。 – Dominik2000

0

您應該使用DI將Domain/DAL接口注入到構造函數中。這有很大的好處,包括允許你在編寫單元測試時使用你的界面。您可以使用Autofac來處理注射。