.NET Framework
管理拡張フレームワーク
サーチ…
備考
制御反転パターンをサポートする他のテクノロジと比較して、MEFの大きな利点の1つは、大量の構成(必要な場合)を必要とせずに、設計時には知られていない依存関係の解決をサポートすることです。
すべての例では、System.ComponentModel.Compositionアセンブリへの参照が必要です。
また、すべての(基本)例では、これらをサンプルビジネスオブジェクトとして使用しています。
using System.Collections.ObjectModel;
namespace Demo
{
public sealed class User
{
public User(int id, string name)
{
this.Id = id;
this.Name = name;
}
public int Id { get; }
public string Name { get; }
public override string ToString() => $"User[Id: {this.Id}, Name={this.Name}]";
}
public interface IUserProvider
{
ReadOnlyCollection<User> GetAllUsers();
}
}
タイプのエクスポート(基本)
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
namespace Demo
{
[Export(typeof(IUserProvider))]
public sealed class UserProvider : IUserProvider
{
public ReadOnlyCollection<User> GetAllUsers()
{
return new List<User>
{
new User(0, "admin"),
new User(1, "Dennis"),
new User(2, "Samantha"),
}.AsReadOnly();
}
}
}
これは事実上どこでも定義できます。重要なことは、アプリケーションが(作成するComposablePartCatalogを介して)どこを探すかをアプリケーションが知っていることです。
インポート(基本)
using System;
using System.ComponentModel.Composition;
namespace Demo
{
public sealed class UserWriter
{
[Import(typeof(IUserProvider))]
private IUserProvider userProvider;
public void PrintAllUsers()
{
foreach (User user in this.userProvider.GetAllUsers())
{
Console.WriteLine(user);
}
}
}
}
これはIUserProvider
に依存する型で、どこにでも定義できます。前の例と同様に、アプリケーションは、(作成するComposablePartCatalogを介して)一致するエクスポートを探す場所をアプリケーションが知っていることだけです。
接続する(基本)
上記の他の(基本的な)例を参照してください。
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace Demo
{
public static class Program
{
public static void Main()
{
using (var catalog = new ApplicationCatalog())
using (var exportProvider = new CatalogExportProvider(catalog))
using (var container = new CompositionContainer(exportProvider))
{
exportProvider.SourceProvider = container;
UserWriter writer = new UserWriter();
// at this point, writer's userProvider field is null
container.ComposeParts(writer);
// now, it should be non-null (or an exception will be thrown).
writer.PrintAllUsers();
}
}
}
}
アプリケーションのアセンブリ検索パスに[Export(typeof(IUserProvider))]
があるUserWriter
、 UserWriter
の対応するインポートが満たされ、ユーザーが印刷されます。
他のタイプのカタログ(例えば、 DirectoryCatalog
)は、 ApplicationCatalog
代わりに(またはそれに加えて)、他の場所でインポートを満たすエクスポートを探すために使用できます。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow