1

私はのIoCと依存性注入の初心者です。私はそれについて読んでいるが、私はそれを得ることができない。 スタッフの仕組みを理解しているうちに、私は自分のプロジェクトにこれらのパターンのいくつかを実装しようとしています(そして試行錯誤で学ぶかもしれません)。実装FluentSecurity(別名NinjectへのStructureMapを移植)

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

、彼らは(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に含まれます。しかし、ObjectFactory.GetAllInstances()のNinjectの代替品は何ですか?
  2. WebRegistryScan、および内部関数TheCallingAssemblyおよびAddAllTypesOfのどの部分にこのコードを挿入するべきか、また同等のものは何もわかりません。

私は、これは少し広範囲に質問ですけど、私は任意の助けに感謝!前もって感謝します。

答えて

1

私は、これはあなたがSMから1をモデルにしたNinject.Extensions.Conventions呼ばninjectの拡張子を、必要になるの依存関係のためのアセンブリをスキャンする機能を取得するには

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

およそequivelentになると思います。

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

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

Kernel.Bind<YourType>().ToSelf(); 
+0

NinjectModuleの部分は正常です。しかし、私はまだ "ResolveServicesUsing"でいくつかの問題があります。ここでの主な難しさは、もともと、ObjectFactory(SMから)が静的クラス(またはそのメソッドだけが静的なもの)ですが、Global.asaxの中には「カーネル」が何であるかわかりません。 – tyron

+0

ああ、修正するのは簡単ですが、どのようにNinjectをブートストラップしているかによって異なります。 「WebActivator」メソッドまたは「Inherit NinjectAppliction」メソッドを使用していますか?ヒント:App_Start/NinjectMVC3.csを持っている場合は、Webアクティベータメソッドを使用しています。 – Brook

+0

ウェブアクティベータメソッドを使用している場合、カーネルのインスタンスを取得する簡単な方法は、プロパティインジェクション '[Inject]を使用することです。 パブリックIKernelカーネル{get;セット; } 'あなたのMvcApplicationで – Brook

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ハンドラを設定した:ISecurityHandler、ISecurityContextなどのような

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

その他の必要な依存関係がFluentSecurityに使用される内部のIoCによって解決されます。

関連する問題