0

同じエラーが発生しているため、元の質問を編集しました。違いは実装です。Ninject をミックスに追加しました。

検証ルールのクラスを作成しました

public class AlbumValidator : AbstractValidator<Album> {
    public AlbumValidator() {
        RuleFor(a => a.Title).NotEmpty();
    }
}

Ninject 用の ValidatorModule を作成しました

internal class FluentValidatorModule : NinjectModule {
    public override void Load() {
        AssemblyScanner.FindValidatorsInAssemblyContaining<AlbumValidator>()
            .ForEach(result => Bind(result.InterfaceType).To(result.ValidatorType).InSingletonScope());
    }
}

ここに私の ValidatorFactory があります

public class NinjectValidatorFactory : ValidatorFactoryBase {
    public override IValidator CreateInstance(Type validatorType) {
        if (validatorType.GetGenericArguments()[0].Namespace.Contains("DynamicProxies")) {
            validatorType = Type.GetType(string.Format("{0}.{1}[[{2}]], {3}",
                validatorType.Namespace,
                validatorType.Name,
                validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName,
                validatorType.Assembly.FullName));
        }

        return Container.Get(validatorType) as IValidator;
    }

    IKernel Container { get; set; }
    public NinjectValidatorFactory(IKernel container) {
        Container = container;
    }
}

および私のグローバルからの関連部分

protected override void OnApplicationStarted() {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);

        var factory = new NinjectValidatorFactory(Container);

        ModelValidatorProviders.Providers.Add(
            new FluentValidationModelValidatorProvider(factory));

        DataAnnotationsModelValidatorProvider
            .AddImplicitRequiredAttributeForValueTypes = false;
    }

    protected override IKernel CreateKernel() {
        return Container;
    }

    IKernel Container {
        get { return new StandardKernel(new FluentValidatorModule()); }
    }

サンプル サイトをロードし、[新しいアルバムの作成] リンクをクリックしてから、作成ボタンをクリックしてタイトルを空のままにします。エラー protected override void OnApplicationStarted() { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes);

        var factory = new NinjectValidatorFactory(Container);

        ModelValidatorProviders.Providers.Add(
            new FluentValidationModelValidatorProvider(factory));

        DataAnnotationsModelValidatorProvider
            .AddImplicitRequiredAttributeForValueTypes = false;
    }

    protected override IKernel CreateKernel() {
        return Container;
    }

    IKernel Container {
        get { return new StandardKernel(
            new Bootstrapper(),
            new FluentValidatorModule()); }
    }

作成フォームをロードし、タイトルを空のままにして作成をクリックすると、エラーが表示されます

This property cannot be set to a null value.

それが参照する行は、Entity Framework の自動生成されたクラス内にあります。

Namespace.Contains("DynamicProxies")

false が返されました。これは、カスタム名前空間 SampleMusicStore.Web を使用するように EF に指示したためですか?

それとも、他に何か不足していますか?

乾杯。

4

1 に答える 1

1

問題は、Entity Framework がクラスで動的プロキシを生成していて、システムが、定義したクラスではなくプロキシ クラスに対して検証を試みていることです。

これを解決する方法は、この回答と同じです。

于 2010-10-04T12:17:16.860 に答える