0

コントローラーがサービスを使用して特定のタスクを実行する MVC3 Web アプリケーションがあります。たとえば、次のように、各アクションで必要なサービスを個別にインスタンス化するために使用します。

 public ActionResult Index()
    {
        ICustomService customService = new CustomService();
        var list = customService.ReturnSomething();
        .....
        return View(list)
    }

これはうまくいきました。次に、より良い設計原則に従うために、依存性注入に MEF を使用することにしました。だから今、私はこのようなことをしています:

   public class MyController : Controller
   {
    [Import]
    private ICustomService _customService;

    public MyController()
    {
        MEFManager.Compose(this);
    }

    public ActionResult Index()
    {
      var list = _customService.ReturnSomething();
      return View(list);
    }

構成は、次の関数である MEFManage.Compose(this) によって行われます。

    public static void Compose(object o)
    {
        var container = new CompositionContainer(
                                                new DirectoryCatalog(Path.Combine(
                                                                       AppDomain.CurrentDomain.BaseDirectory, "bin"))
                                                                    );
        var batch = new CompositionBatch();
        batch.AddPart(o);
        container.Compose(batch);
    }

これは実際に動作しますが、MEF を使用していないときよりも 6 倍から 7 倍遅くなります。なぜこんなに遅いのか誰か知っていますか?私は何か間違ったことをしていますか?

4

3 に答える 3

1

をスピンアップすることCompositionContainerは、リソースを集中的に使用するタスクではありません、を作成するにDirectoryCatalogは、使用可能なすべてのアセンブリをスキャンして、パーツを識別し、エクスポート用の構成要素を分析する必要があります。これはいくつかの方法で改善できます。

  1. すべてのコンテナが構築時に使用する単数DirectoryCatalog(またはできれば a ComposablePartCatalog) を持つことができます。これは、カタログの作成が 1 回だけ行われることを意味します。
  2. コンストラクターでのコンテナーの作成を完全に回避IControllerFactoryし、コントローラー インスタンスをスピンアップするための を実装するか、 IDependencyResolverMVC3 の組み込みサービス ロケーション メカニズムを使用して依存関係の解決を処理するために を実装することができます。MEF + MVC を検索すると、Web 上に多くの例があります。
于 2012-07-25T09:05:42.310 に答える
1

これは、各コントローラー インスタンスが CompositionContainer を再構築しているためだと思われます。これは、ディスク アクセスを行っているように見えます。

CompositionContainer の初期化を Application_Start に移動できますか?

于 2012-07-24T14:51:26.597 に答える
1

私は実際には MEF を使用しませんが、ソリューションは bin フォルダー内のすべてのアセンブリをスキャンして、インポート/エクスポート属性を検索し、アプリケーションを構成すると思います。

MEF を使用する正しい方法ではないと思います。コントローラーは MEF 関連のメソッドを呼び出すべきではありません。

リクエストごとに DI コンテナーを構成すると、似たように見えます。

この記事は良さそうです: Using MEF 2 with ASP.NET MVC 3

于 2012-07-24T14:55:16.213 に答える