4

NinjectHttpApplicationプロジェクトで定義されたいくつかのモジュールを使用しています。

私が望むのは、 http://www.thekip.nl/2011/09/22/using-fluentvalidation-for-both-domain-validation-and-validation-in-mvc-projects/FluentValidationで説明されているように、検証ファクトリを作成することです。

具体的な検証ファクトリを作成するには、オーバーライドする必要があります

IValidator CreateInstance(Type validatorType) 

次に呼び出すメソッド

return kernel.Get<validatorType>() as IValidator

しかし、範囲外で IKernel を使用することGlobal.asaxは推奨されないことを読みました。

私が望むものを作るためのオプションは何ですか?

編集: Ninject-FluentValidation 拡張機能の使用

Remo が述べているように、拡張機能がありますGitHub( https://github.com/ninject/ninject.web.mvc.fluentvalidation )。拡張機能には次のクラスがあります。

public class NinjectValidatorFactory : ValidatorFactoryBase { ... }

コンストラクターを受け取りIKernel、インスタンスを作成しますIValidator

public override IValidator CreateInstance(Type validatorType)
{
    if(((IList<IBinding>)Kernel.GetBindings(validatorType)).Count == 0)
    {
        return null;
    }

    return Kernel.Get(validatorType) as IValidator;
}

私のコードは次のようになります:

public class MvcApplication : NinjectHttpApplication
{
    private NinjectValidatorFactory nvfactory;

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());                        
    }
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Employee", action = "Index", id = UrlParameter.Optional }
        );
    }        
    protected override void OnApplicationStarted()
    {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);

        ModelValidatorProviders.Providers.Clear();
        ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(nvfactory));            
    }
    protected override IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());            
        nvfactory = new NinjectValidatorFactory(kernel);

        return kernel;
    }
}

それはうまくいきます。しかし、それがより良く解決できるかどうかはわかりません。IKernelまた、上のパブリック プロパティとして公開する必要性がわかりませんNinjectValidationFactory

4

4 に答える 4

10

Ninject.Web.Mvc.FluentValidation 拡張機能は、Ninject に流暢な検証のサポートを追加します。NuGet で見つけることができます。https://github.com/ninject/ninject.web.mvc.fluentvalidationを参照してください

于 2012-02-01T00:04:10.587 に答える
4

Mark Seemann のDependency Injection in .NET本を読むことを強くお勧めします。

簡単に言うと、コンテナーに依存関係を要求する場合は、依存関係の挿入を使用していません。コンテナを呼び出しません。それはあなたに電話します。

于 2012-12-15T20:07:00.290 に答える
0

カーネルの実装によっては、これ自体は問題になりません。

カーネルへの依存関係が作成されるため、お勧めしません (そのため、依存性注入ではなくサービス ロケーションを使用しています)。

別のオプションは、Alexsander Beletskyによって説明されているように、プロバイダーの Ninjects 概念を使用することです。

于 2012-01-25T14:24:36.103 に答える