1

私は IoC と依存性注入の初心者です。私はそれについて読んでいますが、私はそれを理解できません。どのように機能するかを理解する一方で、これらのパターンのいくつかを自分のプロジェクトに実装しようとしています (そして試行錯誤によって学習するかもしれません)。

FluentSecurityパッケージ (NuGet から)を使用してセキュリティ制御を実装しています。この wikiで説明されているように、ポリシー違反ハンドラーを実装する必要があります。問題は、この例が StructureMap IoC コンテナー用に書かれており、Ninject 2.2を使用している (または使用しようとしている) ことです (初心者にとってはより単純に思えました)。

彼らのコードでは、(a):

configuration.ResolveServicesUsing(type => ObjectFactory.GetAllInstances(type).Cast<object>());

そして (b):

public class WebRegistry : Registry
{
    public WebRegistry()
    {
        Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.AddAllTypesOf<IPolicyViolationHandler>();
        });
    }
}

私の懸念:

  1. コード (a) が に含まれることはわかっていますGlobal.asax。しかし、Ninject の代替手段はObjectFactory.GetAllInstances()何ですか?
  2. WebRegistryこのコードを挿入する場所も、 、Scan、および内部関数TheCallingAssemblyとに相当するものもわかりませんAddAllTypesOf

これは少し広範な質問であることは承知していますが、助けていただければ幸いです。前もって感謝します。

4

3 に答える 3

3

Marius Schulz は、Ninject をFluentSecurityと一緒に使用したいすべての人に役立つ優れた記事を書きました。

依存関係の解決に Ninject を使用するための FluentSecurity のセットアップ

于 2012-07-02T09:21:37.377 に答える
1

これでほぼ互角になると思います

//add an instance of IKernel to your MvcApplication
[Inject]
public IKernel Kernel { get; set; }
...
configuration.ResolveServicesUsing(type => Kernel.GetAll(type));

依存関係についてアセンブリをスキャンする機能を得るには、SM のものをモデルにしたNinject.Extensions.Conventions と呼ばれるninjectの拡張機能が必要です。

public class WebModule : NinjectModule
{
    public WebModule()
    {
        Kernel.Scan(a => {
                    a.FromAssemblyContaining<YourType>();
                    a.BindWithDefaultConventions();
                    a.InTransientScope();
                });
    }
}

アセンブリ スキャン ビジネスは、あなたがしていることに厳密に必要ではないことは明らかですが、これも同様に機能します。個人的に私はアセンブリ スキャンのファンではありません。なぜなら、それは少し「魔法」に思えるからです。それが機能しない場合、デバッグするのは楽しくありません。

Kernel.Bind<YourType>().ToSelf();
于 2011-11-18T14:21:55.683 に答える
1

あなたがNinjectと同じ問題を抱えていました。何時間もグーグルで調べた後、ソースコードを github からダウンロードしました。コードを理解し、いくつかの方法をデバッグして、サービスを解決する方法を見つけました。私がしなければならないことは、PolicyViolationException ハンドラーを見つけるためのサービス ロケーターを提供することだけです。

Ninject 相当品はこんな感じ。

configuration.ResolveServicesUsing(type => System.Web.Mvc.DependencyResolver.Current.GetServices(type));

私は Ninject MVC3 を使用し、以下のコードを使用して、現在の MVC Web プロジェクトと他のアセンブリからモジュールをロードしました。

private static void RegisterServices(IKernel kernel)
    {
        kernel.Load("*.dll");
        //kernel.Load(Assembly.GetExecutingAssembly());
    }

モジュールで PolicyViolationException ハンドラーを構成しました。

public class MainWebNinjectModule : NinjectModule
{
    public override void Load()
    {
        // other bindings here
        Bind<IPolicyViolationHandler>().To<DenyAnonymousAccessPolicyViolationHandler>();
    }
}

ISecurityHandler、ISecurityContext などの他の必要な依存関係は、FluentSecurity で使用される内部 IoC によって解決されます。

于 2012-02-14T10:55:05.587 に答える