MicrosoftUnityをIoCコンテナーとして使用して新しいASP.NetWebAPIプロジェクトに取り組んでいます。どちらが正しいのか少し混乱しています。
System.Web.Http.HttpConfiguration
のDependencyResolver
を設定した場合。次に、依存関係のあるAPIコントローラーを呼び出すことができ、依存関係はUnityフレームワークによって解決されています。しかし、HomeController
のようなMVCコントローラーの場合、System.Web.Mvc
にDependencyResolver
を設定するまで、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
を設定する必要がありますか、それとも何か間違ったことをしていますか?
同じプロジェクトで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
に使用される名前空間に注意してください