ExportAttribute, ImportAttribute, CompositionContainer and MEF in ASP.NET MVC 3

6735 ワード

Introduction


管理拡張フレームワーク(Managed Extensibility Framework)のASP.NET MVC 3の応用.
本文
処理しない
MEF
または
ASP.NET
 MVC 3
システム
の複雑さ
.

Section 1 MEF Basics


マイクロソフトの観点では、MEFは制御システムの反転ではない.
しかし
,
MEF
提供する
せいぎょシステム
はんてん
コンピテンシー
.
MEFの3つの基本構造
はい
exportattribute
 
,
importattribute
および
compositioncontainer
.
ExportAttributeプロパティを使用して、次のコードをマークします.
class
field
property
indexer
method
あなた
にある
使用
ImportAttributeプロパティ
マーク
以下の
コード:
field
property
indexer
argument.
例1-使用
ExportAttributeタグクラス:
[ExportAttribute]
public class A
{
  public void ShowMessage()
  {
    Console.WriteLine("this is class A");
  }
}

例2
-使用ImportAttribute :
public class B
{
  [ImportAttribute]
  public A PropertyA { get; set; }
}

例3-使用
ExportAttributeタグ方法:
public class C
{
  [ExportAttribute]
  public void DoSomething()
  { 
  }
}
のもう一つのMEF構造はCompositionContainerクラスである.CompositionContainerをExportAttributeまたはImportAttributeの特性がマークされたコードに適用する.ComponentContainerクラスは
义齿
例4では、exportattributeとタグ付けされたAクラスまたはimportattributeのBクラスを定義する完全なプログラムを示した.
compositioncontainerがAクラスとBクラスを受信した例
.
compositioncontainerはコンポーネントを返します.
コンソールアプリケーションで実装することを選択しました.
ASPとは思えませんNET MVC 3アプリケーション、コンソールアプリケーションは1ファイルしか必要ありません.
これで
わかりやすい

MEF
こうぞう
さぎょう
.
namespace MefExample4
{
  using System;
  using System.ComponentModel.Composition;
  using System.ComponentModel.Composition.Hosting;


  [ExportAttribute]
  public class A
  {
    public void ShowMessage()
    {
      Console.WriteLine("this is class A");
    }
  }

  [ExportAttribute]
  public class B
  {
    [ImportAttribute]
    public A PropertyA { get; set; }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // Declare a composition container.
      CompositionContainer compositionContainer = new CompositionContainer();

      // Feed the container instances of A and B.
      compositionContainer.ComposeParts(new A(), new B());

      // Retrieve the composed part.
      B b = compositionContainer.GetExportedValueOrDefault();

      // Use the imported construct of B.
      b.PropertyA.ShowMessage();
    }
  }
}

Section 2- MEF in ASP.NET MVC 3


1. You mark pieces of code that MEF should take care of with ExportAttributes and ImportAttributes.


Example 8
 — MessageSource  
マークExportAttribute
namespace MefMvc01
{
  using System.ComponentModel.Composition;

  [ExportAttribute]
  public class MessageSource
  {
    public MessageSource()
    {
      this.Message = "this message is from MessageSource";
    }

    public string Message { get; private set; }
  }
}

Example 9
 —   HomeController
  ExportAttribute
namespace MefMvc01.Controllers
{
  using System.ComponentModel.Composition;
  using System.Web.Mvc;

  [ExportAttribute]
  public class HomeController : Controller
  {
    [ImportAttribute]
    private MessageSource messageSource;

    public ActionResult Index()
    {
      return View(this.messageSource);
    }
  }
}

2. You create an instance of a CompositionContainer. You supply it with your marked code.

Example 11  — CompositionContainer
protected void Application_Start()
{
  AreaRegistration.RegisterAllAreas();

  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);

  CompositionContainer compositionContainer = new CompositionContainer();
  compositionContainer.ComposeParts(new HomeController(),
                                    new MessageSource());
}

3. You implement the IDependencyResolver interface.

12, IDependencyResolver MefDependencySolver 
クラス#クラス#
. IDependencyResolver 
インタフェースには、 の2つのメソッドが されています.GetService 
and  GetServices
.
namespace MefMvc01
{
  using System;
  using System.Collections.Generic;
  using System.ComponentModel.Composition;
  using System.ComponentModel.Composition.Hosting;
  using System.Web.Mvc;

  public class MefDependencySolver : IDependencyResolver
  {
    public MefDependencySolver(CompositionContainer compositionContainer)
    {
      this.compositionContainer = compositionContainer;
    }

    private CompositionContainer compositionContainer;

    public object GetService(Type serviceType)
    {
      string name = AttributedModelServices.GetContractName(serviceType);
      return compositionContainer.GetExportedValueOrDefault(name);
    }

    public IEnumerable GetServices(Type serviceType)
    {
      return this.compositionContainer
                 .GetExportedValues(serviceType.FullName);
    }
  }
}

もとのアドレス