Microsoft.Extensions.DependencyInjection 1.1.1に依存するASP.NET Core 1.1.2 Webプロジェクトで、一般的なFluentValidationバリデーターをその実装とそのインターフェースの両方で登録してください。実行時には、ホストの建物の間に、私は例外次しまっ:ASP.NETコアで部分的に閉じたジェネリック型を登録するMicrosoft.Extensions.DependencyInjection
An unhandled exception of type 'System.ArgumentException' occurred in Microsoft.Extensions.DependencyInjection.dll
Cannot instantiate implementation type 'MyProj.Shared.Api.WithUserCommandValidator`1[T]' for service type 'FluentValidation.IValidator`1[MyProj.Shared.Model.WithUser`1[T]]'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceTable..ctor(IEnumerable`1 descriptors)
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable`1 serviceDescriptors, Boolean validateScopes)
at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services)
at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at MyProj.Program.Main(String[] args) in X:\MySolution\src\MyProj\Program.cs:line 31
これは(一般的な、非抽象)バリデータクラスです:
public class WithUserCommandValidator<TCommand> : AbstractValidator<WithUser<TCommand>>
where TCommand : ICommand
{
public WithUserCommandValidator(IValidator<TCommand> commandValidator)
{
RuleFor(cmd => cmd).NotNull();
RuleFor(cmd => cmd.UserId).NotEqual(Guid.Empty);
RuleFor(cmd => cmd.Content).NotNull()
.SetValidator(commandValidator);
}
}
(わからない、それは、WithUser<T>
クラスを示すことが重要ですGuid UserId
とT Content
を保持しています)。
登録はそうのように起こる:
someInterface = typeof(FluentValidation.IValidator<WithUser<>>);
someImplementation = typeof(Shared.Api.WithUserCommandValidator<>);
// this is for top-level command validators, injected by interface
services.AddScoped(someInterface, someImplementation);
// this is for nested validators, injected by implementation
services.AddScoped(someImplementation);
と、実行時にこれらの変数を保持する:
+ someInterface {FluentValidation.IValidator`1[MyProj.Shared.Model.WithUser`1[TCommand]]} System.Type {System.RuntimeType}
+ someImplementation {MyProj.Shared.Api.WithUserCommandValidator`1[TCommand]} System.Type {System.RuntimeType}
正しい思われます。
私も同様の問題や疑問を抱えていますが、これは具体的なものですが、一般的な実装であるため、実際には関連していません。
私はDependencyInjectionモジュールコードを踏襲し、例外はhereをスローしました。なんらかの理由で、serviceTypeInfo.IsGenericTypeDefinition
はfalse(インターフェイスタイプが一般的なのでtrueではないはずです)を返し、else-branchがとられます。代わりに、実装タイプが,からimplementationTypeInfo.IsGenericTypeDefinition
に戻りますので、例外があります。
ランタイム値は次のとおりです。
+ serviceTypeInfo {FluentValidation.IValidator`1[MyProj.Shared.Model.WithUser`1[TCommand]]} System.Reflection.TypeInfo {System.RuntimeType}
+ implementationTypeInfo {MyProj.Shared.Api.WithUserCommandValidator`1[TCommand]} System.Reflection.TypeInfo {System.RuntimeType}
いじっている間、私はまた、インターフェース+実装を登録せず、唯一の実装を登録しようとした、その例外が消えます。しかし、可能であれば実装を実装するのではなく、インタフェースを注入したいと思います。
私は間違っていますか? TA
いくつかの詳細:シンプルなインジェクターで
は、単に以下の登録を行うことができます。しかし、私は前者が何を意味するかについての情報はありません。 – superjos