MEF: Как я могу импортировать класс, конструктор которого помечен с помощью ImportingConstructorFlag - PullRequest
1 голос
/ 06 сентября 2010

Название моего вопроса звучит немного сложно - извините. Я новичок в MEF: -).

Мой сценарий:

public class MainClass
{
  [ImportMany(typeof(ITest))]
  private List<ITest> Tests { get; set; }

  public MainClass()
  {
    Init();
  }

  private void Init()
  {
     DirectoryCatalog catalog = new DirectoryCatalog(@"./");
     CompositionContainer container = new CompositionContainer(catalog);
     container.ComposeParts(this);
  }
}



[Export("BirthdayJob")]
[Export(typeof(ITest))]
public partial class BirthdayTest : ITest
{
  [ImportingConstructor]
  public BirthdayUserControl(IParameter parameter)
  {
     InitializeComponent();
     this.Parameter = jobParameter;
  }

   public IParameter Parameter { get; set; }
}

[Export(typeof(IParameter))]
[Export("BirthdayParameter")]
public class BirthdayJobParameter : IParameter
{
   public override string ToString()
   {
       return "Birthday Remember";
   }
}


public interface IParameter : IMefInterface
{

}

public interface IMefInterface
{

}

В общем списке тестов у меня должны быть все возможные объекты ITest со связанным объектом IParameter. К сожалению, в общем списке нет элементов.

Вы можете помочь? Что я сделал не так?

Заранее спасибо.

С уважением, про

// Edit

Итак, у меня есть компилируемый класс для моей задачи:

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;

namespace ObjectContracts
{
    public class Program
    {
        static void Main(string[] args)
        {
            var container = new CompositionContainer(new TypeCatalog(typeof (IFoo), typeof (Bar), typeof(Foo)));
            var bar = container.GetExportedValue<Bar>();
            Console.WriteLine(bar.Foo.Message);
            Console.ReadLine();

        }

    }

    [InheritedExport]
    public interface IFoo
    {
        string Message { get; set; }
    }

    [Export]
    public class Bar
    {
        [ImportingConstructor]
        public Bar([Import("Foo")]IFoo foo)
        {
            this.Foo = foo;
        }

        public IFoo Foo { get; set;}
    }

    [Export("Foo")]
    public class Foo : IFoo
    {
        public Foo()
        {
            Message = ":-)";
        }
        public string Message { get; set; }
    }
}

Что я делаю не так? Пожалуйста, помогите мне: -)

С уважением, Патрик

Ответы [ 4 ]

2 голосов
/ 11 августа 2011

Дело в том, что если вы используете контракт (в вашем случае "BirthdayJob") в вашем экспорте, вам нужно указать это и в вашем импорте.Вот так:

[Export("BirthdayJob",typeof(ITest))]
public partial class BirthdayTest : ITest
{
  // class definition
}

И ваш импорт:

public class MainClass
{
  [ImportMany("BirthdayJob",typeof(ITest))]
  private List<ITest> Tests { get; set; }

  // class definition
}

Самое замечательное в контрактах заключается в том, что они позволяют группировать экземпляры определенных объектов определенного типа и отфильтровывать любые нежелательныеэкземпляры объектов определенного типа.

MEF самый крутой!

[Export("PeopleLivingInEdmontonAlbertaCanada",typeof(IPerson))]
public Person KevinParkinson { get; set; }
1 голос
/ 07 сентября 2010

Скорее всего, это рабочий каталог вашего DirectoryCatalog (в зависимости от того, как вы запускаете приложение.)

Чтобы убедиться, что это проблема, замените:

DirectoryCatalog catalog = new DirectoryCatalog(@"./");

С либо:

DirectoryCatalog catalog = new DirectoryCatalog(@"<full path to directory>");

или

AssemblyCatalog catalog = new AssemblyCatalog(typeof(BirthdayTest).Assembly);
1 голос
/ 07 сентября 2010

Я нашел решение.В классе экспорта класса foo должна быть ссылка на производный интерфейс.Конструктор, имеющий флаг importingconstructor, должен также иметь ссылку на интерфейс.

 [Export]
    public class Bar
    {
        [ImportingConstructor]
        public Bar([Import("Foo", typeof(IFoo))]IFoo foo)
        //public Bar([Import(typeof(IFoo))]IFoo foo)
        {
            this.Foo = foo;
        }

        public IFoo Foo { get; set;}
    }

    [Export("Foo", typeof(IFoo))]
    public class Foo : IFoo
    {
        public Foo()
        {
            Message = ":-)";
        }
        public string Message { get; set; }
    }
0 голосов
/ 06 сентября 2010

Вы экспортируете IParameter куда-нибудь? В опубликованном вами коде это не так, поэтому тест на День Рождения не проводится.

...