2

さまざまな CRUD およびクエリ操作を公開する必要がある IoC コンテナー (この場合は単純なインジェクターですが、この問題はそのコンテナーに関連しているとは思いません) で MVC4 Web API を使用して Web API を構築しています。私の場合に IOC を使用する理由は、私たちが開発ショップであり、顧客が独自の Web API コントローラーを構築して、システムから必要なデータを公開できるようにする必要があるためです。その結果、私は自分のソリューションを設計して、私たちと私たちの顧客の両方のすべてのコントローラーを外部に作成し、IOC を介してロード可能にすることで、自分の製品をドッグフードできるようにしたいと考えていました。

ウェブサイトにはライブラリへの参照はありませんが、ライブラリにはウェブサイトで使用したいコントローラーが含まれています。型はコンテナーに登録され、DependencyResolver はカスタムの依存関係リゾルバーに設定されます。dllプラグインを見つけてコントローラータイプをロードするコードがありますが、それが表すルートに移動しようとすると、見つからないと言われます。

つまり、/api/Test1Api に移動しようとすると、"hello world" というテキストが表示されます。

ここでの問題は、コントローラーの種類を読み込んだにもかかわらず、それを Web サイトが示すルートに変換できないことです。

エラーが発生します

リクエスト URI に一致する HTTP リソースが見つかりませんでした

「Test1Api」という名前のコントローラーに一致する型が見つかりませんでした。

コンテナを登録する方法は次のとおりです

public static class SimpleInjectorInitializer
{
    /// <summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary>
    public static void Initialize()
    {
        //// Did you know the container can diagnose your configuration? Go to: http://bit.ly/YE8OJj.

        // Create the IOC container.
        var container = new Container();

        InitializeContainer(container);

        container.RegisterMvcAttributeFilterProvider();
        // Verify the container configuration
        container.Verify();

        // Register the dependency resolver.
        GlobalConfiguration.Configuration.DependencyResolver =
                    new SimpleInjectorWebApiDependencyResolver(container);
    }

    private static void InitializeContainer(Container container)
    {
        var appPath = AppDomain.CurrentDomain.BaseDirectory;

        string[] files = Directory.GetFiles(appPath + "\\bin\\Plugins", "*.dll",
            SearchOption.AllDirectories);
        var assemblies = files.Select(Assembly.LoadFile);

        // register Web API controllers
        var apiControllerTypes =
            from assembly in assemblies
            where !assembly.IsDynamic
            from type in assembly.GetExportedTypes()
            where typeof(IHttpController).IsAssignableFrom(type)
            where !type.IsAbstract
            where !type.IsGenericTypeDefinition
            where type.Name.EndsWith("Controller", StringComparison.Ordinal)
            select type;

        // register MVC controllers
        var mvcControllerTypes =
            from assembly in assemblies
            where !assembly.IsDynamic
            from type in assembly.GetExportedTypes()
            where typeof(IController).IsAssignableFrom(type)
            where !type.IsAbstract
            where !type.IsGenericTypeDefinition
            where type.Name.EndsWith("Controller", StringComparison.Ordinal)
            select type;

        foreach (var controllerType in apiControllerTypes)
        {
            container.Register(controllerType);
        }

        foreach (var controllerType in mvcControllerTypes)
        {
            container.Register(controllerType);
        }
    }
}

どんな助けでも大歓迎です。

4

2 に答える 2