0

パラメータ化されたコンストラクターを持つ ApiController があります。フレームワークが依存性注入を使用してコントローラーを作成する可能性があることを読みました。

だから私はこれを行います(ここで説明したようにhttp://code.google.com/p/autofac/wiki/MvcIntegration):

Global.asax

builder.RegisterControllers(Assembly.GetExecutingAssembly());
//or this
builder.RegisterType<ObjectsController>().InstancePerHttpRequest();

コントローラーは次のようになります。

public class ObjectsController : ApiController
    {
        IMyObject m_myObject = null;

        public ObjectsController(IMyObject obj)
        {
            m_myObject = obj;
        }
}

Global.asax 依存関係を解決するために、私はこれを使用しました:

builder.Register<IMyObject >((c, p) =>
            {
                //... create object ...

                return obj;
            }).InstancePerHttpRequest();

しかし、私はこのエラーが発生します:

「ObjectsController」にはデフォルトのコンストラクターがありません。

私はDIを使ってこれを行うことができると思った

4

4 に答える 4

2

ASP.NET Web API で DI を使用する場合は、この回答がより良い解決策になります: https://stackoverflow.com/a/10592456/538387

于 2012-10-22T18:53:38.197 に答える
1

Unity を使用している場合、ASP.NET 4 Web API RC で行う必要があるのはこれだけです (2013 年 8 月 8 日現在)。

「Microsoft.Practices.Unity.dll」への参照を追加 [NuGet で追加されたバージョン 3.0.0.0 を使用しています] 「Unity.WebApi.dll」への参照を追加します [バージョン 0.10.0.0 で追加されましたNuGet] タイプ マッピングをコンテナに登録します - Unity.WebApi プロジェクトによってプロジェクトに追加される Bootstrapper.cs のコードと同様です。ApiController クラスから継承するコントローラーで、パラメーターの型をマップされた型として持つパラメーター化されたコンストラクターを作成します。見よ、別のコード行なしでコンストラクターに注入された依存関係を取得します!

于 2013-08-08T10:51:06.373 に答える
1

最も一般的な解決策は、DI 固有のIDependencyResolver実装を使用することです。

その記事では Unity での例を示していますが、AutoFac で簡単に動作させることができるはずです。

于 2012-10-22T19:00:47.373 に答える
0

他の人が示唆したように、 IDependencyResolver 実装を使用することをお勧めします。

残念ながら、これは WebAPI が ApiController ベースのクラスでパラメーターなしのコンストラクターを必要とするという問題を解決しませんでした。=> Web API コントローラー基本クラスでコンストラクター注入の代わりにプロパティ注入を使用し、空のパラメーターなしのコンストラクターを提供します。美しくはないけどKISS :-)

 public class ApiControllerBaseWithDependency : ApiController
{
    [Microsoft.Practices.Unity.Dependency]
    protected MyServiceType Service { get; set;}
}
于 2015-05-03T09:18:58.403 に答える