2012-06-05 35 views
0

所以我在我的應用程序中使用Autofac,看起來如下(從上到下的方法)。Autofac - DDD分層應用程序 - iRepository的參考泛型 - howto?

該項目是在MVC 4中,我添加了AutoFac.MVC4測試版。

  • Web應用程序客戶端(Web應用程序 - 表現層):命名空間= AppBase.Web
  • Web App的核心(如各種actionresults,...。):命名空間= AppBase.Web.Core
  • 服務(如AuthenticationService,MemberService,TaskService):namespace = AppBase.Service
  • Data(包括Repositories,...):namespace = AppBase.Data
  • Domain(POCO對象Code Fist):n​​amespace = AppBase。域名

我在Web應用程序客戶端與下面的初始化代碼包括Autofac(現在):

public void RegisterContainersUsingAutofac() 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterModelBinders(Assembly.GetExecutingAssembly()); 
     builder.RegisterModelBinderProvider(); 
     builder.RegisterControllers(typeof(MvcApplication).Assembly); 

     IContainer container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
    } 

Web應用程序客戶端引用核心,域名和服務層。 服務層引用數據層(對於存儲庫)。

我有我叫iRepository數據層的接口,我所有的庫實現這些

我想知道,我是否應該添加到我的「RegisterContainersUsingAutofac」的方法是什麼代碼,全自動(以一般的方式)增加所有的存儲庫和服務,所以我不應該每次都添加myselve。 請記住,數據層沒有被引用(我可以,但我不認爲它應該)。

PS。我過去使用過Unity,但是我喜歡AutoFac所具有的通用方法(在一個項目中,我有超過+/- 180行添加存儲庫和服務的功能,所以這是我不想要的)。

回答

2

直到最近我還在使用Unity.Mvc並切換到Autofac。我對Unity.Mvc的問題是無緣無故的,它會工作一分鐘而不是下一個,看起來很不穩定。

Autofac可以輕鬆使用和配置,自從我開始使用它以來,我一直沒有遇到任何問題。

我使用WebActivator,因此大部分配置的東西都在它們自己的類中作爲引導程序對象,而不是用一堆代碼亂丟Global.asax文件。

下面是Autofac引導程序的(VB.NET)代碼。您會看到最初我將每個服務對象和每個存儲庫對象都註冊到該文件中,但現在它們被註釋掉了,而我使用了自動註冊功能。

該項目使用Mvc4。

#Region "Imports" 

Imports System.Reflection 
Imports Autofac 
Imports Autofac.Integration.Mvc 
Imports MyCompany.Data.Interfaces 
Imports MyCompany.Data.Repositories 
Imports MyCompany.Services 
Imports MyCompany.Services.Interfaces 
Imports MyCompany.Web.Mvc.Public.Bootstrap 
Imports MyCompany.Web.Mvc.Public.Services 

#End Region 

#Region "Assembly Meta" 

' This tells the app to run the "Start" method prior to running the App_Start method in Global.asax 
<Assembly: WebActivator.PreApplicationStartMethod(GetType(AutofacDI), "Initialize")> 

#End Region 

Namespace MyCompany.Web.Mvc.Public.Bootstrap 

    ''' <summary> 
    ''' Class to setup dependency injection and register types/services. 
    ''' </summary> 
    ''' <remarks></remarks> 
    Public NotInheritable Class AutofacDI 

     ''' <summary> 
     ''' Method to register the Autofac dependency injection component. 
     ''' </summary> 
     ''' <remarks> 
     ''' This line of code below could alternatively be placed in Global.asax App_Start(), doing 
     ''' so in this manner ensures that this gets run "PreStart". 
     ''' </remarks> 
     Public Shared Sub Initialize() 

      ' Create Unity dependency container. 
      Dim dependencyContainer = BuildIocContainer() 

      ' Set DI resolver 
      DependencyResolver.SetResolver(New AutofacDependencyResolver(dependencyContainer)) 

     End Sub 

     ''' <summary> 
     ''' Registers the IOC types/services. 
     ''' </summary> 
     ''' <returns></returns> 
     ''' <remarks></remarks> 
     Private Shared Function BuildIocContainer() As Autofac.IContainer 

      Dim builder = New ContainerBuilder 

      With builder 
       ' Register Controllers 
       .RegisterControllers(Assembly.GetExecutingAssembly()) 

       ' Custom MyCompany/Mvc objects 
       .RegisterType(Of FormsAuthenticationService)().As(Of IFormsAuthenticationService)().InstancePerHttpRequest() 
       .RegisterType(Of AccountMembershipService)().As(Of IMembershipService)().InstancePerHttpRequest() 

       '*************************************************************** 
       '* MyCompany service objects. 
       '*************************************************************** 
       ' This is auto registration, it replaces all the individual registration lines of code below. 
       builder.RegisterAssemblyTypes(GetType(CatalogCodeService).Assembly). 
        Where(Function(t) t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest() 

       '.RegisterType(Of CatalogCodeService)().As(Of ICatalogCodeService)().InstancePerHttpRequest() 
       '.RegisterType(Of ChargeCodeService)().As(Of IChargeCodeService)().InstancePerHttpRequest() 
       '.RegisterType(Of CommentsService)().As(Of ICommentsService)().InstancePerHttpRequest() 
       '.RegisterType(Of CommissionService)().As(Of ICommissionService)().InstancePerHttpRequest() 
       '.RegisterType(Of ConfigCriteriaService)().As(Of IConfigCriteriaService)().InstancePerHttpRequest() 
       '.RegisterType(Of ConfigGroupService)().As(Of IConfigGroupService)().InstancePerHttpRequest() 
       '.RegisterType(Of ConfigQuestionService)().As(Of IConfigQuestionService)().InstancePerHttpRequest() 
       '.RegisterType(Of ContactService)().As(Of IContactService)().InstancePerHttpRequest() 
       '.RegisterType(Of CustomerProductItemService)().As(Of ICustomerProductItemService)().InstancePerHttpRequest() 
       '.RegisterType(Of CustomerService)().As(Of ICustomerService)().InstancePerHttpRequest() 
       '.RegisterType(Of OrderItemService)().As(Of IOrderItemService)().InstancePerHttpRequest() 
       '.RegisterType(Of OrderService)().As(Of IOrderService)().InstancePerHttpRequest() 
       '.RegisterType(Of PriceBreakService)().As(Of IPriceBreakService)().InstancePerHttpRequest() 
       '.RegisterType(Of PriceService)().As(Of IPriceService)().InstancePerHttpRequest() 
       '.RegisterType(Of ProductItemService)().As(Of IProductItemService)().InstancePerHttpRequest() 
       '.RegisterType(Of QuoteItemService)().As(Of IQuoteItemService)().InstancePerHttpRequest() 
       '.RegisterType(Of QuoteService)().As(Of IQuoteService)().InstancePerHttpRequest() 
       '.RegisterType(Of ShipmentItemService)().As(Of IShipmentItemService)().InstancePerHttpRequest() 
       '.RegisterType(Of ShipmentService)().As(Of IShipmentService)().InstancePerHttpRequest() 
       '.RegisterType(Of ShoppingCartItemService)().As(Of IShoppingCartItemService)().InstancePerHttpRequest() 
       '.RegisterType(Of ShoppingCartService)().As(Of IShoppingCartService)().InstancePerHttpRequest() 
       '.RegisterType(Of SystemTableItemService)().As(Of ISystemTableItemService)().InstancePerHttpRequest() 

       '*************************************************************** 
       '* MyCompany repository objects (used by service objects above) 
       '*************************************************************** 
       ' This is auto registration, it replaces all the individual registration lines of code below. 
       builder.RegisterAssemblyTypes(GetType(CatalogCodeRepository).Assembly). 
        Where(Function(t) t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerHttpRequest() 

       '.RegisterType(Of CatalogCodeRepository)().As(Of ICatalogCodeRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ChargeCodeRepository)().As(Of IChargeCodeRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of CommentsRepository)().As(Of ICommentsRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of CommissionRepository)().As(Of ICommissionRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ConfigCriteriaRepository)().As(Of IConfigCriteriaRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ConfigGroupRepository)().As(Of IConfigGroupRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ConfigQuestionRepository)().As(Of IConfigQuestionRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ContactRepository)().As(Of IContactRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of CustomerProductItemRepository)().As(Of ICustomerProductItemRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of CustomerRepository)().As(Of ICustomerRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of IOrderItemRepository)().As(Of IOrderItemRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of OrderRepository)().As(Of IOrderRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of PriceBreakRepository)().As(Of IPriceBreakRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of PriceRepository)().As(Of IPriceRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ProductItemRepository)().As(Of IProductItemRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of QuoteItemRepository)().As(Of IQuoteItemRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of QuoteRepository)().As(Of IQuoteRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ShipmentItemRepository)().As(Of IShipmentItemRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ShipmentRepository)().As(Of IShipmentRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ShoppingCartItemRepository)().As(Of IShoppingCartItemRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of ShoppingCartRepository)().As(Of IShoppingCartRepository)().InstancePerHttpRequest() 
       '.RegisterType(Of SystemTableItemRepository)().As(Of ISystemTableItemRepository)().InstancePerHttpRequest() 
      End With 

      Return builder.Build() 

     End Function 

    End Class 

End Namespace 

正如你所看到的,Autofac自動註冊功能代替超過40行代碼使用Unity.Mvc需要(我留在那些線條和評論他們突出)!

享受!

+0

只是一個小問題。 我的global.asax.cs是,我沒有得到我的數據層的引用,但我的服務層引用數據層。 我該如何添加存儲庫呢?由於DDD設計禁止我添加數據層,因爲它不公開任何服務。 – NicoJuicy

+0

不確定您正在使用的實施架構。就我而言,我的數據層是我的Repository庫。爲了使DI工作,您仍然需要將對UI項目的引用添加到數據層。 如果你打算使用DI,調用應用程序(在這種情況下是UI)需要定義在遇到接口時要注入的內容。 服務層沒有地方可以定義啓動時,UI會這樣做。 因此在調用應用程序中需要引用數據層(Repository)。用戶界面不會調用任何存儲庫方法,這發生在服務層。 –

1

你有沒有考慮過使用命名約定? http://code.google.com/p/autofac/wiki/Scanning

var assemblyToScan = Assembly.GetExecutingAssembly(); 

builder.RegisterAssemblyTypes(assemblyToScan) 
.Where(t => t.Name.EndsWith("Repository")) 
.AsImplementedInterfaces(); 

builder.RegisterAssemblyTypes(assemblyToScan) 
.Where(t => t.Name.EndsWith("Service")) 
.AsImplementedInterfaces(); 

您也可以註冊使用基本類型爲覆蓋在這個崗位Autofac Scanning Assemblies for certain class type

+0

在我的答案中正確地發佈了下面的內容,自動註冊是一個非常不錯的功能。 –

+1

對不起Ed - 我乍看之下在所有註釋掉的行中都沒有看到,否則只會添加一條關於使用Base類型掃描的註釋......也值得用一些我傾向於使用泛型的存儲庫使用它來註冊泛型,例如builder.RegisterGeneric(typeof運算(NHibernateRepository <>))作爲(typeof運算(IRepository <>))。並不總是合適的,但能夠滿足大多數存儲庫的需求。 –

+0

只是一個小問題。在我的global.asax.cs中,我沒有對數據層的引用,但是我的服務層引用了數據層。我如何添加存儲庫呢?由於DDD設計禁止我添加數據層,因爲它不公開任何服務。 – NicoJuicy