2

nugetテンプレートを使用してMVC3アプリを挿入します。つまり、WebActivatorを使用して静的クラスのメソッドを呼び出し、静的クラスでNinjectブートストラッパーを作成してMVC3に接続します。

これは、コントローラー、アダプターなどで正常に機能します。ただし、Ninjectを使用して依存関係を取得する別のWebactivatorアクティブ化クラスが必要です。

私はそれを貧弱な人の解決策で動作させるようになりましたが、私はよりエレガントな解決策を好みます。

まず、WebactivatorクラスがPostApplicationStartMethod呼び出しを使用していることを確認します。これは、NinjectモジュールがPreApplicationStartMethodを使用しているため、ninjectがロードされ、準備ができていることを確認できます。

var workers = DependencyResolver.Current.GetServices<IWorker>();

依存関係を取得するには、クラス全体が次のようになります

[assembly: WebActivator.PostApplicationStartMethod(typeof(SHB.DALA.Web.App_Start.WorkflowRunner), "Start")]

namespace SHB.DALA.Web.App_Start
{
    public static class WorkflowRunner 
    {
        public static void Start()
        {
            var workers = DependencyResolver.Current.GetServices<IWorker>();
            //Do stuff with worker collection
        }
    }
}

もっとエレガントな解決策があるはずですよね?

4

2 に答える 2

3

WebActivator(実際にはASP.NET)にはNinjectプロジェクトの知識がないため、パラメーターを挿入することはできません。これを実現するには、Ninject WebActivator拡張機能(Ninject MVC拡張機能と同じ方法)が必要になります。しかし率直に言って、これはちょっとした落とし穴です。WebActivatorでNinjectをセットアップし、同時にNinjectでWebActivatorをセットアップする必要があります。

私はあなたのために2つの可能なシナリオを考えることができます:

  1. WorkflowRunnerコードはそのままにしておきます-正直なところ、クラスが気に入らない理由はわかりません。これは素晴らしい小さなクラスであり、他のコードに依存することはありませDependencyResolverん。Ninject自体から抽象化された参照を取得し、ワークフローの初期化がそこにうまくカプセル化されます。ここでは何も悪い匂いはしません。

  2. Ninjectをセットアップする他のWebActivatorクラスでワークフローを初期化します。ここで、Ninjectが初期化され、ワー​​クフロー初期化コードを別のクラスに保持できることがわかります。

もし私があなたなら、私は明らかに1を選びます。

于 2011-10-27T06:30:19.123 に答える
0

すでにNinjectブートストラッパーが機能している場合、別のソリューションが必要ですか?コントローラ以外の依存関係については、GetInstance()メソッドを持つBindingFactoryクラスを使用します。これは、カーネルオブジェクトのGet()メソッドを呼び出すだけです。

public class BindingFactory
{
    private static readonly IKernel Kernel = new StandardKernel(new DefaultServices());

    public static T GetInstance<T>()
    {
        return Kernel.Get<T>();
    }

    public static IController GetControllerInstance(Type controllerType)
    {
        return Kernel.Get(controllerType) as IController;
    }
}

次に、BindingFactoryを利用するNinjectControllerFactoryを使用します。

public class NinjectControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext context, Type controllerType)
    {
        if (controllerType == null)
            return null;

        return BindingFactory.GetControllerInstance(controllerType);
    }
}

ですから、現在の実装を適応させることができると思います。

于 2011-10-26T13:13:17.350 に答える