1

だから私は次のように見えるアプリケーションでAutofacを使用しています(トップダウンアプローチから)。

プロジェクトは MVC 4 にあり、AutoFac.MVC4 ベータ版を追加しました。

  • Web アプリ クライアント (Web アプリケーション - プレゼンテーション層): 名前空間 = AppBase.Web
  • Web App Core (例: さまざまなアクション結果など): 名前空間 = AppBase.Web.Core
  • サービス (例: AuthenticationService、MemberService、TaskService): 名前空間 = AppBase.Service
  • データ (リポジトリなどを含む): 名前空間 = AppBase.Data
  • ドメイン (Code Fist の POCO オブジェクト): 名前空間 = AppBase.Domain

次の初期化コードを使用して、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 App Client は、コア、ドメイン、およびサービス レイヤーを参照します。サービス レイヤーは、データ レイヤー (リポジトリ用) を参照します。

データ層に iRepository というインターフェイスがあり、すべてのリポジトリがこれらを実装しています

すべてのリポジトリとサービスを自動的に (一般的な方法で) 追加するには、「RegisterContainersUsingAutofac」メソッドにどのコードを追加すればよいのでしょうか。データレイヤーは参照されていないことに注意してください(参照できますが、そうすべきではないと思います)。

PS。以前は Unity を使用していましたが、AutoFac の一般的な方法が気に入っています (あるプロジェクトでは、リポジトリとサービスを追加するために +/-180 行以上あるため、これはもう必要ありません)。

4

2 に答える 2

2

私も最近まで Unity.Mvc を使用していましたが、Autofac に切り替えました。Unity.Mvc に関する私の問題は、理由もなく突然、1 分間は動作し、次の時間は動作しないということでした。非常に不安定に見えました。

Autofac は簡単に使用および構成でき、使用を開始して以来、問題は 1 つもありませんでした。

私は 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

ご覧のとおり、Unity.Mvc を使用するために必要だった 40 行以上のコードが、Autofac 自動登録機能によって置き換えられました (これらの行は残しておき、ハイライトするためにコメントを付けました)!!

楽しみ!!

于 2012-06-06T12:55:32.003 に答える
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 スキャン アセンブリの記事で説明されているように、基本タイプを使用して登録することもできます。

于 2012-06-06T20:13:13.813 に答える