MVC4 と Unity 2.1 を使用しています。サービスには、セッション状態から取得した資格情報に基づくサービス キーが必要です。
次のようにサービスを登録します。
container.RegisterType<IInventoryService, InventoryService>();
InventoryService のコンストラクターも同様に単純です。
public InventoryService(ServiceKey serviceKey) { ... }
私の Web サイトでサービスが必要になったとき、セッションからの資格情報を使用してサービス キーを自動的に作成するサービス ロケーターを使用します。
public static T Resolve<T>(ServiceKey serviceKey = null)
{
if (serviceKey == null)
{
serviceKey = SessionManager.ServiceKey;
}
var parameterOverride = new ParameterOverride(SERVICEKEY_PARAMETERNAME, serviceKey);
return Resolve<T>(null, parameterOverride);
}
これはうまくいきました。問題は、サイトを MVC に変換し、既存のサービス ロケーター (依存関係ファクトリ) を使用する単純な依存関係リゾルバーを使用して、サービスをコントローラーに挿入しようとしていることです。
public class CustomDependencyResolver : IDependencyResolver
{
public object GetService(Type serviceType)
{
return MvcDependencyFactory.Resolve(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return MvcDependencyFactory.ResolveAll(serviceType);
}
}
私のコントローラーは次のようになります。
public InventoryController(IInventoryService inventoryService) { ... }
問題は、MVC が、インベントリ コントローラーをインスタンス化しようとしたときに、パラメーターのないコンストラクターが見つからないというエラーを表示することです。Unityにサービスキーを登録していないことが原因だと思います。しかし、そうしようとすると、セッションが構築される前に、MVC がコントローラーを解決しようとし、続いてサービスを解決しようとしていることがわかります。
私はこれについて正しく考えていませんか?サービスでセッション資格情報を使用する、コントローラーでサービスを使用する、コントローラーを構築するためにリゾルバーを使用するなど、各ステップはかなり合理的だと感じていますが、これを機能させるために頭を悩ませてきました。