0

MvcのWeb拡張機能を使用してDynamoIoCを試していますが、Global.asaxを派生させるカスタムHttpApplicationを作成するのに優れた作業を行っていることがわかります。しかし、何かが足りないようです。

コントローラーでDIを実行したいのですが、通常の「コントローラーにはパラメーターなしのコンストラクターが必要です」という問題が発生します。

これは、global.asax(から派生DynamoMvcAndWebApiApplication)で行うことです。

protected override void RegisterDependencies(Dynamo.Ioc.IIocContainer container)
{
    container.Register<ILogger, FakeLogger>();
}

それから私のコントローラー:

public class HomeController : Controller
{
    private readonly ILogger logger;

    public HomeController(ILogger logger)
    {
        this.logger = logger;
    }

    public ActionResult Index()
    {
        logger.Log("test");
        return View();
    }
}

これにより、「パラメーターなしのコンストラクターエラーは発生しません」というメッセージが表示されます。DynamoのWeb拡張機能は、DIを機能させるために必要なものはすべてすでに処理していると思いました。

パラメータなしのコンストラクタを追加すると呼び出されますが、ILoggerはnullになり、アクションメソッドでNullReferenceExceptionが発生します。

ControllerFactoryを実装する必要があると考えましたが、必須の場合はMVCの他のすべてのものと一緒に提供されると思いました。そのため、提供されているものを誤用していると思います。

このシナリオでDIを機能させる方法を誰かが知っているかどうか知りたいです。ありがとう。

4

3 に答える 3

1

私の推測では、依存関係を登録するときにHomeControllerを登録しないためです。あなたの例によると、あなたはそうしません。

于 2012-10-15T13:30:01.397 に答える
0

MartinFに同意します。HomeControllerの依存関係を解決する場合は、Dynamoコンテナから解決してインスタンス化する必要があります。確かに、私はあなたの解決コードを見ていませんが、それが起こっていることを推測しています。「DynamoはMVCと完全に統合されていない」という問題ではないと思います。コンテナーの動作によっては、解決を試みる前にHomeControllerをコンテナーに明示的に登録する必要がない場合もありますが、依存関係を満たすために、コンテナーに解決を依頼する必要があります。他のコンテナの使用法に基づいた私の推測です。

于 2013-03-19T20:41:48.877 に答える
-1

長い間掘り下げて実験した結果、DynamoはMVCと完全に統合されていないようです。NinjectとMVCの統合を試しましたが、すぐに使用できます。

私の推測では、Dynamoは「まだそこにない」だけです。今後も更新をチェックし続けます。

于 2012-12-07T12:29:07.283 に答える