Asp.net mvc 4 Autofac-DDD分层应用程序-iRepository的参考泛型-如何?

Asp.net mvc 4 Autofac-DDD分层应用程序-iRepository的参考泛型-如何?,asp.net-mvc-4,autofac,Asp.net Mvc 4,Autofac,因此,我在我的应用程序中使用Autofac,如下所示(自上而下的方法) 该项目在MVC4中,我添加了AutoFac.MVC4测试版 Web应用程序客户端(Web应用程序-表示层):名称空间=AppBase.Web Web应用程序核心(例如各种actionresults,…):名称空间=AppBase.Web.Core 服务(例如AuthenticationService、MemberService、TaskService):名称空间=AppBase.Service 数据(包括存储库,…):名称

因此,我在我的应用程序中使用Autofac,如下所示(自上而下的方法)

该项目在MVC4中,我添加了AutoFac.MVC4测试版

  • Web应用程序客户端(Web应用程序-表示层):名称空间=AppBase.Web
  • Web应用程序核心(例如各种actionresults,…):名称空间=AppBase.Web.Core
  • 服务(例如AuthenticationService、MemberService、TaskService):名称空间=AppBase.Service
  • 数据(包括存储库,…):名称空间=AppBase.Data
  • 域(代码Fist的POCO对象):名称空间=AppBase.Domain
我在我的Web应用程序客户端中包含了Autofac,其初始化代码如下(目前):

Web应用程序客户端引用核心、域和服务层。 服务层引用数据层(用于存储库)

我的数据层中有一个名为iRepository的接口,我的所有存储库都实现了这些接口

我想知道,我应该向我的“RegisterContainersUsingAutofac”方法添加什么代码,以自动(以通用方式)添加所有存储库和服务,所以我不应该每次都自己添加它们。 请记住,数据层没有被引用(我可以,但我认为不应该)


注:我过去使用过Unity,但我喜欢AutoFac的通用方法(在一个项目中,我有超过+/-180行添加存储库和服务,所以这是我不再想要的东西)。

直到最近我还在使用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.Integration.Mvc
导入MyCompany.Data.Interfaces
导入MyCompany.Data.Repositories
进口MyCompany.服务
导入MyCompany.Services.Interfaces
导入MyCompany.Web.Mvc.Public.Bootstrap
导入MyCompany.Web.Mvc.Public.Services
#末端区域
#区域“装配元”
'这告诉应用程序在Global.asax中运行app_Start方法之前先运行“Start”方法
#末端区域
命名空间MyCompany.Web.Mvc.Public.Bootstrap
''' 
''类来设置依赖项注入和注册类型/服务。
''' 
''' 
公共不可继承类AutofacDI
''' 
''方法注册Autofac依赖项注入组件。
''' 
''' 
''下面这行代码也可以放在Global.asax App_Start()中,执行以下操作
''因此,以这种方式确保“启动前”运行。
''' 
公共共享子初始化()
'创建统一依赖项容器。
Dim dependencyContainer=BuildIocContainer()
'设置DI解析器
DependencyResolver.SetResolver(新的AutofacDependencyResolver(dependencyContainer))
端接头
''' 
''注册IOC类型/服务。
''' 
''' 
''' 
私有共享函数BuildIocContainer()作为Autofac.IContainer
Dim生成器=新的容器生成器
与建筑商
'寄存器控制器
.RegisterController(Assembly.GetExecutionGassembly())
'自定义MyCompany/Mvc对象
.RegisterType(FormsAuthenticationService的)().As(FormsAuthenticationService的)().InstancePerHttpRequest()
.RegisterType(AccountMembershipService的)().As(IMembershipService的)().InstancePerHttpRequest()
'***************************************************************
'*MyCompany服务对象。
'***************************************************************
'这是自动注册,它将替换下面的所有单个注册代码行。
RegisterAssemblyTypes(GetType(CatalogCodeService).Assembly)。
其中(函数(t)t.Name.EndsWith(“服务”)).AsImplementedInterfaces().InstancePerHttpRequest()
“.RegisterType(CatalogCodeService的)().As(ICatalogCodeService的)().InstancePerHttpRequest()
“.RegisterType(ChargeCodeService的)().As(IChargeCodeService的)().InstancePerHttpRequest()
“.RegisterType(CommentsService的)().As(ICommentsService的)().InstancePerHttpRequest()
“.RegisterType(CommissionService的)().As(ICommissionService的)().InstancePerHttpRequest()
“.RegisterType(ConfigCriteriaService的)().As(IConfigCriteriaService的)().InstancePerHttpRequest()
'.RegisterType(属于ConfigGroupService)().As(属于IConfiggGroupService)().InstancePerHttpRequest()
'.RegisterType(属于ConfigQuestionService)().As(属于IConfigQuestionService)().InstancePerHttpRequest()
“.RegisterType(ContactService的)().As(IContactService的)().InstancePerHttpRequest()
'.RegisterType(属于CustomerProductItemService)().As(属于ICCustomerProductItemService)().InstancePerHttpRequest()
“.RegisterType(CustomerService的)().As(ICCustomerService的)().InstancePerHttpRequest()
'.RegisterType(OrderItemService的)().As(IOrderItemService的)().InstancePerHttpRequest()
'.RegisterType(OrderService的)().As(IOrderService的)().InstancePerHttpR
#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
var assemblyToScan = Assembly.GetExecutingAssembly();

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

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