Я думаю, что, вероятно, лучший подход - это перевернуть это. Вместо того, чтобы пытаться зарегистрировать свои компоненты через Unity, вы фактически оставляете обнаружение этих частей MEF. MEFContrib включает в себя механизм интеграции Unity, который позволяет вводить составные части MEF в компоненты Unity. Это было первоначально подробно описано в блоге Петра Вёдека , где он также дает вам образец. По сути, это работает так: вы можете использовать серию методов расширения на вашем UnityContainer
для регистрации ваших каталогов. Внутри он создаст соответствующее расширение и подключит ваш контейнер.
Вот быстрый и грязный пример, мы создадим несколько интерфейсов:
public interface IUnityComponent
{
IEnumerable<IMefComponent> MefComponents { get; }
}
public interface IMefComponent
{
string Name { get; }
}
А затем некоторые образцы деталей, которые мы экспортируем (через MEF):
[Export(typeof(IMefComponent))]
public class MefComponent1 : IMefComponent
{
public string Name { get { return "MEF Component 1"; } }
}
[Export(typeof(IMefComponent))]
public class MefComponent2 : IMefComponent
{
public string Name { get { return "MEF Component 2"; } }
}
Теперь мы создадим еще одну часть (она будет создана с помощью Unity):
public class UnityComponent : IUnityComponent
{
public UnityComponent(IEnumerable<IMefComponent> mefComponents)
{
// mefComponents should be provided from your MEF container.
MefComponents = mefComponents;
}
public IEnumerable<IMefComponent> MefComponents { get; private set; }
}
Чтобы связать все это, нам просто нужно использовать метод расширения RegisterCatalog
на вашем UnityContainer
(импорт MefContrib.Integration.Unity
после добавления ссылки на MEFContrib):
var container = new UnityContainer();
// Register the catalog - this handles MEF integration.
container.RegisterCatalog(new DirectoryCatalog("."));
// Register our Unity components.
container.RegisterType<IUnityComponent, UnityComponent>(new ContainerControlledLifetimeManager());
Теперь вы должны иметь возможность захватить экземпляр и перечислить части, предоставленные MEF:
// Grab an instance of our component.
var instance = container.Resolve<IUnityComponent>();
foreach (var mefComponent in instance.MefComponents)
{
Console.WriteLine(mefComponent.Name);
}
примечание : 100% не проверено.