2

AutofacIoCコンテナの問題を解決しようとしています。

私のWebアプリケーションには次の部分があります。

  1. ウェブアプリケーション
  2. コア(共有)ライブラリ。
  3. モジュール

各モジュールにはコアライブラリ(以下のコードを含む)への参照があり、各モジュールは独自のタイプを登録できる必要があります。したがって、アプリケーションとモジュールの間に1つの共有コンテナーが必要です。

私は次のコンテナのコー​​ドを持っています:

public static class DependencyContainer
    {
        public static IContainer Container { get; private set; }

        public static ContainerBuilder Builder { get; private set; }

        public static void RegisterType<TFrom, TTo>() where TTo : TFrom
        {
            Builder.RegisterType<TTo>().As<TFrom>();
        }

        public static T ResolveType<T>()
        {
            return Container.Resolve<T>();
        }

        public static void InitContainer()
        {
            Builder = new ContainerBuilder();
            Container = Builder.Build();
        }
    }

このコンテナは、メイン(コア)ライブラリにあります。アプリケーションが起動すると、global.asaxからInitContainer()が呼び出されます。この後、RegisterType()メソッドを使用してアプリケーションモジュールから新しいタイプを登録しようとしています。

しかし、この後、私はどのタイプも解決できません。このタイプが登録されていないという例外をスローするだけです。

このコードの主なアイデアは、1つの共有コンテナーのみを使用して、任意のモジュールおよびWebアプリケーションから任意のタイプを解決できるようにすることです。

誰かがこの問題で私を助けることができますか?複数のライブラリ間で1つの共有IoCコンテナを使用するためのより洗練されたアーキテクチャソリューションはありますか?

前もって感謝します!

4

2 に答える 2

4

あなたの設計はService Locator のアンチパターンにつながります。コア ライブラリでコンテナを定義して、誰もがそれを参照できるようにします。依存性注入を使用し、アプリケーションの起動パスであるComposition Rootでコンテナーを構成します (この場合、構成ルートは Web アプリケーションの一部になります)。

Autofac モジュール機能を利用でき、コンポジション ルートでこのモジュールを登録できます。

builder.RegisterModule(new CarTransportModule());

ただし、モジュール登録クラスを静的として定義することもできます。これはさらに簡単です。

MyApp.SomeModule.SomeModuleBootstrapper.Register(builder);
于 2012-05-24T11:07:37.937 に答える
2

問題は解決しました-すべての依存関係を登録した後でのみcontainer.Build()を呼び出す必要があります...

于 2012-05-26T06:00:32.277 に答える