1

通常の ASP.MVC プロジェクトでは、Unity とhttp://unitymvc3.codeplex.com/の Unity.Mvc3 パッケージで依存関係リゾルバーを構成します。

このテスト サービスは、HierarchicalLifetimeManagerに登録されています。

container.RegisterType<ITestService, TestService>(new HierarchicalLifetimeManager());

そして、Global.asax.cs でコンテナーを Mvc に接続します。

System.Web.Mvc.DependencyResolver.SetResolver(new Unity.Mvc3.UnityDependencyResolver(container));

そして、このテスト コントローラーを実行します。

public class TestController : Controller
{
    private readonly ITestService _service;
    public TestController(ITestService service)
    {
        this._service = service;
    }
    public ActionResult Test()
    {
        var locatedService = System.Web.Mvc.DependencyResolver.Current.GetService<ITestService>();
        if (_service == locatedService)
            return View("Success - Same Service");//This is always the result in an MVC controller
        else
            throw new Exception("Failure - Different Service Located");//This is never the result in an MVC controller
    }
}

ただし、このプロジェクトでは、多数の WebAPI コントローラーを追加しています。

global.asax.cs にこの構成があります (今のところhttp://unitywebapi.codeplex.com/を使用しています。ただし、提案は受け付けています)。

System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

fromではなく from からの継承にApiTestController似た を作成しました。ただし、ApiTestController はテストに失敗します。クラスとプロパティが Mvc 固有であることは理解しています。しかし、WebAPI には同等のものがありますか?TestControllerApiControllerControllerSystem.Web.Mvc.DependencyResolverSystem.Web.Mvc.DependencyResolver.Current

System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver.GetServiceSystem.Web.Http.GlobalConfiguration.Configuration.DependencyResolverインスタンスは構成した親コンテナーであるため、機能しません。ITestService をコンストラクターに挿入するために使用されたのは、子コントローラーではありません。

このユーザーも同様の問題を抱えているようです

ありがとう

4

3 に答える 3

2

http://unitymvc3.codeplex.com/http://unitywebapi.codeplex.com/のソースを調べた後、次のクラスを作成しました。

public class MyUnityDependencyResolver : Unity.Mvc3.UnityDependencyResolver, System.Web.Http.Dependencies.IDependencyResolver
{
    public MyUnityDependencyResolver(IUnityContainer container)
        : base(container)
    {
    }

    public System.Web.Http.Dependencies.IDependencyScope BeginScope()
    {
        return this;
    }

    public void Dispose()
    {
        Unity.Mvc3.UnityDependencyResolver.DisposeOfChildContainer();
    }
}

gobal.asax.cs の構成:

var myResolver = new MyUnityDependencyResolver(container);
System.Web.Mvc.DependencyResolver.SetResolver(myResolver);
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = myResolver;

Unity.Mvc3.UnityDependencyResolverHttpContext.Current.Items子コンテナの管理に 使用します。MyUnityDependencyResolverの最も「正しい」実装ではないかもしれませんが、System.Web.Http.Dependencies.IDependencyResolverこれまでのところうまくいくようです。

他に良い回答がない場合は、数日以内にこれを回答としてマークします。

于 2012-10-30T17:54:14.057 に答える
1

残念ながら、GlobalConfiguration.Configuration.DependencyResolver.GetService を呼び出すと、スコープが完全に無視され、アプリケーションの存続期間中存在する外側の非子コンテナーを使用して解決されます。これは Web Api の問題であり、コントローラーの外部で要求ごとの依存関係にコンストラクター インジェクションを使用することができなくなります。紛らわしいことに、これはあなたが言うようにMVCとはまったく異なる動作です。

できることは、HttpRequestMessage から GetDependencyScope() 拡張メソッドを使用することです。これを使用して解決するものはすべて、HierarchicalLifetimeManager を Unity.WebApi と組み合わせて使用​​する場合、リクエスト スコープごとになります。要求はアクション フィルターとハンドラーから利用できるため、実行可能な回避策になる可能性があります。

明らかに、これは理想とはほど遠い依存性注入ではなく、純粋なサービスの場所ですが、コントローラーの外部で要求ごとの依存性にアクセスする別の方法は見つかりませんでした。

詳細については、この投稿を参照してください。

于 2013-04-03T15:49:25.617 に答える
0

これDependencyResolverは、ASP.NET WebAPI での依存関係の挿入に適した継ぎ目ではありません。

Mark Seemann は、WebAPI を使用した DI に関する 2 つの非常に優れた投稿をしています。

ASP.NET Web API による依存関係の挿入と有効期間の管理

Castle Windsor を使用した ASP.NET Web API での依存関係の挿入

正しく行いたい場合は、それらを確認する必要があります。

于 2012-10-31T08:15:36.940 に答える