0

私の現在のセットアップでは、単純な IoC に Ninject を使用しています。すべてうまくいきますが、必要なクラスの 1 つを解決できませんAuthorizeAttribute。ClaimsVerification を行うクラスにアクセスする必要があります。

これが私のコードです:

IoC 構成:

        var kernel = new StandardKernel(); // Ninject IoC
        // These registrations are "per instance request".
        // See http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

        kernel.Bind<RepositoryFactories>().To<RepositoryFactories>()
            .InSingletonScope();

        kernel.Bind<IRepositoryProvider>().To<RepositoryProvider>();
        kernel.Bind<ISmartDocumentorUow>().To<SmartDocumentorUow>();
        kernel.Bind<IClaimsVerification>().To<ClaimsVerification>();
       // kernel
        //kernel.BindFilter<MyAuthorizeAttribute>(FilterScope.Controller, 0).WhenControllerHas<RequireRolesAttribute>();

        // Tell WebApi how to use our Ninject IoC
        config.DependencyResolver = new NinjectDependencyResolver(kernel);

MyAuthorizeAttribute:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    [Inject]
    IClaimsVerification clamisverify { get; set; }

    public MyAuthorizeAttribute()
    {
        //var x = System.Web.Mvc.DependencyResolver.Current.(typeof(IClaimsVerification));
    }
4

2 に答える 2

1

申し訳ありませんが、問題は Web API で機能しない iClaimsverification を注入することでした..

私は公共の財産を試してみましたが、それでもうまくいきませんでした。

bindfilter は、コアの NInject API (dll) には存在しないため、コメント アウトされています。ninject の MVC dll には存在しますが、Web MVC のアクション フィルターでは機能し、API MVC では機能しません。伝えることができます..

私はこのような問題を解決しましたが、この修正の多くは好きではありません:

 private IClaimsVerification verifier
    {
        get
        {
            return (GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IClaimsVerification)) as IClaimsVerification);
        }
    }
于 2012-09-28T14:03:06.570 に答える
0

マークしたプロパティInjectは非公開です - カスタム構成で Ninject を初期化して、はるかに効率の悪いプロセスを選択する必要があります

(質問で問題を述べていませんでした。BindFilterを試していたようですが、コメントアウトされています(なぜですか?)-これは正しいアプローチです。例として、BindFilterのNinject.MVC3 wiki記事を読むことをお勧めします)

于 2012-09-26T21:58:29.730 に答える