2014-01-23 1 views
0

Я создаю приложение импорта базы данных, чем я хочу быть расширяемым (пользовательские модели db могут быть добавлены по мере необходимости). У моего базового компонента есть методы, которые должны реализовывать расширенные типы: MapData & SaveData.Использование MEF с абстрактным базовым классом

Я определил базу как абстрактный класс, и все работает, когда расширенные типы находятся в одном пространстве имен. Тем не менее, я хочу использовать MEF для импорта расширенных типов в другое пространство имен во время выполнения, но я не могу понять, как это сделать.

Базовый класс:

namespace Program 
{ 
    public abstract class Component 
    { 
     public abstract string TypeName { get; } 
     public abstract DataSet MapData(DataSet db); 
     public abstract bool SaveData(); 
    } 
} 

расширенного класса (в отдельном проекте):

using Program.Component; 
namespace ExtendedType 
{ 
    [Export(typeof(Component)] 
    class Type1 : Component 
    { 
     public override string TypeName { get { return "Type1" } } 
     public override DataSet MapData(DataSet db) 
     { 
      // create various object models from db here 
      return db; 
     } 
     public override bool SaveData() 
     { 
      // save object models 
      return true; 
     } 
    } 
} 

Программа импортировать все расширенные типы:

namespace Program 
{ 
    [ImportMany(typeof(Component))] 
    public IEnumerable<Component> componentTypes; 

    public Program() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(Component).Assembly)); 
     container = new CompositionContainer(catalog); 
     this.container.ComposeParts(this); 
    } 
} 

Согласно тому, что я имею прочитайте, атрибут [ImportMany] в IEnumerable должен заполнить это во время выполнения, но он всегда пуст. CompositionContainer всегда пуст.

Что я установил неправильно? Как я могу получить список расширенных типов компонентов?

+0

ссылки, которые я нашел, похожи на то, что я хочу сделать: Расширение типов в том же пространстве имен: [ссылка] (http://vivekcek.wordpress.com/2012/10/ 12/abstract-class-with-mef /) Экспорт/ИмпортMany типов в разных пространствах имен: [link] (http://www.codeproject.com/Articles/188054/An-Introduction-to-Managed-Extensibility-Framework) – David

ответ

0

я в конечном итоге создание каталога расширений для MEF компонентов жить и установив переменную в App.Config, а также каталог сборки других проектов, чтобы отметить там. Спасибо @JaredPar за помощь.

var extensionFolder = ConfigurationManager.AppSettings["ExtensionPath"]; 
var solutionPath = Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.FullName; 
var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(solutionPath + extensionFolder)); 
var container = new CompositionContainer(catalog); 
container.ComposeParts(this); 
2

MEF будет искать только набор типов/сборок, который определяется CompositionContainer. В этом случае сборки для Type1 там нет, поэтому она так и не была найдена. Для этого вам необходимо включить сборку для Type1 в CompositionContainer.

catalog.Catalogs.Add(new AssemblyCatalog(typeof(Type1).Assembly) 
+0

Возможно, я ошибаюсь, но не нужно ли мне редактировать программу каждый раз, когда я добавляю новый тип? Я могу использовать каталог, но я не уверен, как заставить типы в другом проекте компилироваться в определенный каталог: catalog.Catalogs.Add (новый каталог каталогов (Path.GetDirectoryName (Assembly.GetExecutingAssembly(). Location))) ; – David

+1

@ Кларк большинство базовых систем MEF просто добавят все сборки в заданный каталог, чтобы он был сконфигурирован – JaredPar

+0

@Clarke в моем проекте У меня есть шаг после сборки для каждого проекта модуля, который копирует двоичные файлы в каталог «modules». 'xcopy' - король! – Gusdor

 Смежные вопросы

  • Нет связанных вопросов^_^