수색…


비고

제어 패턴 반전을 지원하는 다른 기술에 비해 MEF의 큰 장점 중 하나는 구성을 많이 필요로하지 않고도 디자인 타임에 알려지지 않은 종속성을 해결할 수 있다는 것입니다.

모든 예제에는 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 의 해당 가져 오기가 충족되고 사용자가 인쇄됩니다.

다른 유형의 카탈로그 (예 : DirectoryCatalog )는 ApplicationCatalog 대신 (또는 그에 추가하여) 가져 오기를 충족시키는 내보내기를 다른 곳에서 찾기 위해 사용할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow