web-dev-qa-db-ja.com

System.Web.Http.HttpConfigurationのDependencyResolverとSystem.Web.MvcのDependencyResolver

MicrosoftUnityをIoCコンテナーとして使用して新しいASP.NetWebAPIプロジェクトに取り組んでいます。どちらが正しいのか少し混乱しています。

System.Web.Http.HttpConfigurationDependencyResolverを設定した場合。次に、依存関係のあるAPIコントローラーを呼び出すことができ、依存関係はUnityフレームワークによって解決されています。しかし、HomeControllerのようなMVCコントローラーの場合、System.Web.MvcDependencyResolverを設定するまで、Unityは依存関係を挿入できません。

APIコントローラーの依存関係は解決されましたが、MVCコントローラーの依存関係は解決されませんでした。以下のコードを追加すると:

public class IocConfig
{
    public static void Register(HttpConfiguration config)
    {
        var container = UnityConfig.GetConfiguredContainer();
        FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
        FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));
        config.DependencyResolver = new UnityResolver(container);
        //DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }
}

MVCコントローラーの依存関係は正常に解決されましたが、APIコントローラーの依存関係は解決されませんでした。以下のコードを追加した場合:(行のコメント解除

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

プロジェクトテンプレートがASP.NetWeb APIであり、Microsoft.Unityを使用していることをお知らせください。

両方のDependencyResolverを設定する必要がありますか、それとも何か間違ったことをしていますか?

9
ali

同じプロジェクトでMVCとWebAPIの両方を使用する場合は、両方のリゾルバーを設定する必要があります。同じコードの場所でそうする場合は、名前空間の前にリゾルバーを付けて区別します。

var container = UnityConfig.GetConfiguredContainer();

FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

//MVC
DependencyResolver.SetResolver(new Unity.Mvc5.UnityDependencyResolver(container));
//Web API
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

さまざまなDependencyResolverに使用される名前空間に注意してください

6
Nkosi