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
もとのアドレス