0

そのため、 Mark Seemann の例を使用して、MVC 4 RC Web Api の Windsor で依存性注入を行いましたが、ApiController への依存性を解決できないという例外が発生しました。

public class StatisticsController : ApiController
{
    private readonly ILogger _logger;
    private readonly IClickMessageProducer _producer;

    public StatisticsController(ILogger logger, 
        IClickMessageProducer clickMsgProducer)
    {
        _logger = logger;
        _producer = clickMsgProducer;
    }

    public string Get(string msg, string con) {...}
}

私の Global.asax は次のようになります。

protected void Application_Start()
    {
        // different configs removed for brevity

        BootstrapContainer();
    }

    private static IWindsorContainer _container;

    private static void BootstrapContainer()
    {
        _container = new WindsorContainer()
            .Install(FromAssembly.This(), new ProducerInstaller())
            .Install(FromAssembly.This(), new WebWindsorInstaller());

        GlobalConfiguration.Configuration.Services.Replace(
            typeof(IHttpControllerActivator),
            new WindsorHttpControllerActivator(_container));
    }

インストーラーは、Windsor に に必要な参照を提供しIClickMessageProducerます。私はそれをIController本物のMVC 4プロジェクトで使用しているので、その部分が機能していると確信しています。

StatisticsController具体的に言うと、API への GET 呼び出しでメソッドにアクセスしようとすると、次のエラー メッセージが表示されます。

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
    Can't create component 'APIMVC.Controllers.StatisticsController'
    as it has dependencies to be satisfied. 
    'APIMVC.Controllers.StatisticsController' is waiting for the following 
    dependencies: - Service 'Castle.Core.Logging.ILogger' which was not registered.
</ExceptionMessage>
<ExceptionType>Castle.MicroKernel.Handlers.HandlerException</ExceptionType>
<StackTrace>...</StackTrace>
</Error>

呼び出しは次のようになります: "http://localhost:60000/api/statistics?msg=apitest&con=apimvc"

私の Windsor 実装に関する実際の例や問題へのコメントがあれば、喜んでそれを見ていきます。

4

2 に答える 2

0

ILogger の実装が Windsor に登録されていません。StatisticsController から ILogger パラメータを削除して、再試行してください。動作する場合は、ILogger 実装を登録する必要があります。

于 2012-11-28T15:25:56.513 に答える
0

_container = new WindsorContainer().Install(FromAssembly.This(), new ProducerInstaller()).Install(FromAssembly.This(), new WebWindsorInstaller());

これは障害のある部分でした。ご覧のとおり、I call Install(FromAssembly.This())two witch により、 2 回LoggerInstaller追加しようLoggingFacilityとしてエラーが発生しました。

新しい実装は次のようになります。 _container = new WindsorContainer().Install(FromAssembly.This(), new ProducerInstaller(), new WebWindsorInstaller());

于 2012-11-29T13:01:51.947 に答える