サーチ…


備考

制御反転パターンをサポートする他のテクノロジと比較して、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))]があるUserWriterUserWriterの対応するインポートが満たされ、ユーザーが印刷されます。

他のタイプのカタログ(例えば、 DirectoryCatalog )は、 ApplicationCatalog代わりに(またはそれに加えて)、他の場所でインポートを満たすエクスポートを探すために使用できます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow