32

私は Web API を開発しており、カスタム DependencyResolver を使用することにしました。この [Web API コントローラーの依存性注入]の記事を参照します。コントローラーへの依存性注入に関しては、これまでのところすべてがうまく機能しています。私の Owin スタートアップ クラスからの構成のコード スニペット

private void RegisterIoC(HttpConfiguration config)
{
    _unityContainer = new UnityContainer();
    _unityContainer.RegisterType<IAccountService, AccountService>();
    .........
    .........
    config.DependencyResolver = new UnityResolver(_unityContainer);
}

しかし、Api が初めて起動するときに、 UnityResolver のGetServiceメソッド内でResolutionFailedException がスローされます(ただし、キャッチされます) 。ここに例外メッセージがあります

"Exception occurred while: while resolving. 
Exception is: InvalidOperationException - 
The current type, System.Web.Http.Hosting.IHostBufferPolicySelector, 
**is an interface and cannot be constructed. Are you missing a type mapping?**"

上記の同じ例外が次のタイプでスローされます

System.Web.Http.Hosting.IHostBufferPolicySelector
System.Web.Http.Tracing.ITraceWriter
System.Web.Http.Metadata.ModelMetadataProvider
System.Web.Http.Tracing.ITraceManager
System.Web.Http.Dispatcher.IHttpControllerSelector
System.Web.Http.Dispatcher.IAssembliesResolver
System.Web.Http.Dispatcher.IHttpControllerTypeResolver
System.Web.Http.Controllers.IHttpActionSelector
System.Web.Http.Controllers.IActionValueBinder
System.Web.Http.Validation.IBodyModelValidator
System.Net.Http.Formatting.IContentNegotiator

上記のタイプのユニティ構成でマッピングを提供しなかったため、これらの ResolutionFailedException がスローされることはわかっています。

ここに私の質問があります:-、カスタムunity DependencyResolverを実装する場合、上記のタイプのマッピングを定義する必要があり、対応するデフォルトの実装タイプを定義する必要がある場合、またはDependencyResolverを実装する別の方法があります。アプリケーションは現在正常に動作していますが、上記のタイプの解決に失敗すると、後で深刻な問題が発生する可能性があることを本当に心配しています. 助けてください

最後の追加:- 次のタイプの場合、Web API に何らかのアクションを要求すると、同じ ResolutionFailedException がスローされます。

System.Web.Http.Dispatcher.IHttpControllerActivator
System.Web.Http.Validation.IModelValidatorCache
System.Web.Http.Controllers.IHttpActionInvoker
4

7 に答える 7

7

上記の解決策のいずれかがまだうまくいかない場合は、次の方法で解決しました。

このエラーを追跡するために 1 日を費やした後、何らかの VS キャッシングの問題であることが判明しました。必死になって、すべての .suo ファイルと force-get-latest を削除したところ、問題が解決したようです。

于 2016-07-28T04:49:49.553 に答える
2

通常、Unity では必要ありません。IDependencyResolver のこの実装を unity で使用します。インターフェイス/サービス以外を登録またはマップする必要はありません。

public class UnityDependencyInjectionResolver : Disposable, IDependencyResolver
{
    protected IUnityContainer Container;

    public UnityDependencyInjectionResolver(IUnityContainer container)
    {
        if (container == null)
        {
            throw new ArgumentNullException("container");
        }

        Container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return Container.Resolve(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return null;
        }
    }

    public T GetService<T>()
    {
        try
        {
            var serviceType = typeof(T);
            return (T)Container.Resolve(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return default(T);
        }
    }

    public T GetService<T>(string name)
    {
        try
        {
            var serviceType = typeof (T);
            return (T) Container.Resolve(serviceType, name);
        }
        catch (ResolutionFailedException)
        {
            return default(T);
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return Container.ResolveAll(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return new List<object>();
        }
    }

    public IDependencyScope BeginScope()
    {
        var child = Container.CreateChildContainer();
        return new UnityDependencyInjectionResolver(child);
    }

    protected override void DisposeManagedResources()
    {
        if (Container == null)
        {
            return;
        }

        Container.Dispose();
        Container = null;
    }
}

ここで、Disposable は単なる基本クラスであり、IDispoable を実装しています。

それが役立つことを願っています。

于 2014-10-20T03:21:12.360 に答える