1

MVC 4 プロジェクトを MVC 5 ベータ版 (および Web Api プロジェクトを Web Api 2) に変換したところ、DependencyResolver必要なクラスを解決できないという問題が発生しています。

解決したいクラスは次のとおりです。

 public class GetPartsQueryValidationHandler
    : IQueryValidationHandler<GetPartsQuery, Part[]>
{
    ...
}

Bootstrapper.cs で Autofac に登録する方法は次のとおりです (両方のプロジェクトでこれを行います)。

 builder.RegisterAssemblyTypes(dataAccessAssembly)
               .AsClosedTypesOf(typeof(IQueryValidationHandler<,>))
               .InstancePerHttpRequest(); //..PerApiRequest in Web Api

また、両方のプロジェクトに DependencyResolver を登録します。

Mvc プロジェクト:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

Web API プロジェクト:

 GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

次に、3 番目のプロジェクトで、以下を呼び出して参照を解決します。

 var handlerType = typeof(IQueryValidationHandler<,>).MakeGenericType(query.GetType(), typeof(TResult));
 dynamic handler = DependencyResolver.Current.GetService(handlerType);

しかし、これは私にヌルを与えますhandler

どうにかしてそのクラスを解決する必要があります。

4

1 に答える 1

0

OK DependencyResolver を置き換える方法を見つけました...コンストラクターの依存関係がオプションである場合、これはアンチパターンのようです。以前はそれを機能させる方法がわかりませんでしたが、もう一度試してみると、必要なのはIComponentContextコンストラクターパラメーターだけで、デフォルトで Autofac が処理してくれるようです。

public class DefaultQueryBus : IQueryBus
{
    private readonly IComponentContext componentContext;

    public DefaultQueryBus(IComponentContext componentContext)
    {
        this.componentContext = componentContext;
    }

    public IEnumerable<ValidationResult> Validate<TResult>(IQuery<TResult> query)
    {
        var handlerType = typeof(IQueryValidationHandler<,>).MakeGenericType(query.GetType(), typeof(TResult));
        dynamic handler = this.componentContext.Resolve(handlerType); //Good
    }
}
于 2013-07-14T17:05:14.357 に答える